TCP发送接口的返回值
原文链接: http://blog.csdn.net/ordeder/article/details/17240221
1. TCP发送接口:send()
TCP发送数据的接口有send,write,sendmsg。在系统内核中这些函数有一个统一的入口,即sock_sendmsg()。由于TCP是可靠传输,所以对TCP的发送接口很容易产生误解,比如sn = send(...); 错误的认为sn的值是表示有sn个字节的数据已经发送到了接收端。其实真相并非如此。
我们知道,TCP的发送和接收在在内核(linux)中是有对应的缓冲的:
- struct sock{
- ...
- struct sk_buff_head receive_queue; //接收的数据报队列
- struct sk_buff_head write_queue; //即将发送的数据报队列
- ...
- }
对于发送端而言,用户空间调用send(data)等发送接口将数据发送,内核会将data拷贝到内核空间的socket对应的缓冲中,即sock.write_queue。而send()函数的返回值仅仅是表示本次send()调用中成功拷贝的字节数(用户空间->内核空间对应的sock缓冲队列)。具体发送和接收端的接收就由TCP协议完成,虽然TCP是可靠传输,但是这个前提是发送端和接收端的网络是连接的,否则你懂得。这样,对于调用send()发送的用户而言,如果想要确定接收方是否成功接受数据,就得需要靠其他的办法查询。
2. send()阻塞和非阻塞
前面已说过,sn = send(data)负责将数据拷贝到内核空间,而具体发送是有tcp后续完成(这里面就包括流量控制等)。对已阻塞和非阻塞仅仅是对于数据从用空空间拷贝到内核空间的发送缓冲这段期间而言的。
1. 如果发送缓冲剩余空间大于欲发送data的字节数,对于阻塞和非阻塞而言都能成功将数据拷贝至内核缓冲,返回的sn即等于欲发送的数据的字节数。
2.如果发送缓冲剩余空间小于欲发送data的字节数:
阻塞模式,会进行阻塞,等待内核缓冲的空闲空间,然后继续将数据拷贝到内核缓冲中,直到全部拷贝为止。返回rn即为data的数据量。
非阻塞模式,当内核发送缓冲被填满后,立即返回。rn等于data中已被拷贝到发送缓冲的数据量。
3. 如何判定接收成功接收数据?
1.接收端回复应答信息:这个方法比较土,但也是比较实用的
2.计算发送端sock已发送数据量:如何判断TCP数据包是否发送成功
TCP发送接口的返回值的更多相关文章
- postman 上一个接口的返回值作为下一个接口的入参
在使用postman做接口测试的时候,在多个接口的测试中,如果需要上一个接口的返回值作为下一个接口的入参,其基本思路是: 1.获取上一个接口的返回值 2.将返回值设置成环境变量或者全局变量 3.设置下 ...
- 接口需要上一个接口的返回值(unittest)
import unittest,requests ''' 使用unittest框架的时候,这个接口需要上一个接口的返回值 ''' class Test_case(unittest.TestCase): ...
- JMeter-一个接口的返回值作为输入传给其他接口
背景: 在用JMeter写接口case,遇到一种情况,接口1查看列表接口,接口2查看详情接口,接口2需要传入接口1列表的第一条数据的id 解决方案: 首先放一下总体截图 具体步骤 1-新建一个Thre ...
- SpringBoot第十一集:整合Swagger3.0与RESTful接口整合返回值(2020最新最易懂)
SpringBoot第十一集:整合Swagger3.0与RESTful接口整合返回值(2020最新最易懂) 一,整合Swagger3.0 随着Spring Boot.Spring Cloud等微服务的 ...
- jmeter将上一个接口的返回值作为下一个接口的请求参数
接口响应结果,通常为HTML.Json格式的数据,对于HTML的响应结果的提取,可以通过正则表达式,XPath提取. 对于Json格式响应结果,可以通过正则表达式.JSON Extractor插件.B ...
- Callable接口--有返回值的线程
Callable java5之前是没有返回值的,Java5新增了Callable接口获得线程的返回值,可返回值的任务必须实现Callable接口,类似的,无返回值的任务必须Runnable接口.Cal ...
- postman提取接口的返回值及动态设置变量(一)
一.提取接口返回值 1.当返回值是返回JSON时 let json = JSON.parse(responseBody); // responseBody是包含整个返回内容的字符串 let foo ...
- Java Callable接口——有返回值的线程
实际开发过程中,我们常常需要等待一批线程都返回结果后,才能继续执行.<线程等待——CountDownLatch使用>中我们介绍了CountDownLatch的使用,通过使用CountDow ...
- postman工具中如何提取接口的返回值
提取接口返回值 当返回值是返回JSON时 1.let json = JSON.parse(responseBody); // responseBody是包含整个返回内容的字符串 提取某字段的值: ...
随机推荐
- ArrayList&LinkedList&Map&Arrays
Java集合框架 1:集合接口 1.1:Collection接口 Collection接口是构造集合框架的基础.它声明所有类集合都将拥有的核心方法 Boolean add(Object obj) 将o ...
- ASP.NET MVC view引入命名空间
两种方式:1,在cshtml中引入@using Admin.Models 2,在 Views 文件夹中的 Web.config 文件中添加引用如: <pages pageBaseType=&qu ...
- CSSOM之getComputedStyle,currentStyle,getPropertyValue,getAttribute
js关于CSSOM编程的样式相关几个常用的方法 webkit:getComputedStyle,getPropertyValue IE:currentStyle,getAttribute 前言 jqu ...
- Linux 监控文件被什么进程修改
安装: apt-get install auditd. auditd 是后台守护进程,负责监控记录 auditctl 配置规则的工具 auditsearch 搜索查看 aureport 根据监控记录生 ...
- Skyfree的毕业论文 《系统封装与部署的深入研究》
Skyfree的毕业论文 <系统封装与部署的深入研究> https://www.itsk.com/thread-197-1-4.html Skyfree 发表于 2007-9-13 07: ...
- 用Js+css3实现图片旋转,缩放,裁剪,滤镜
还是前端图片的老话题,花了半天时间,东拼西凑,凑出个demo,优点在于代码少,核心代码就6行,目前刚做了旋转,缩放,裁剪,滤镜要js做,网络上也有现成的代码, 但是想做到自定义的滤镜咋办呢?这还要从底 ...
- centos7中 npm install express 时Error: Cannot find module 'express'错误
费了很大劲最后在网上找到,在自己的工程目录下再次执行npm install express搞定.
- VRP
VRP系统命令采用分级保护方式,命令被划分为参观级.监控级.配置级.管理级4个级别. 参观级:网络诊断工具命令(ping.tracert).从本设备出发访问外部设备的命令(包括:Telnet客户端.S ...
- CSS布局:两列,左边宽度自适应,右边宽度固定200px
<div id="box1"> <div id="left1"></div> <div id="right1 ...
- 树(二)——二叉树
目录 本章主要讲解内容为: 树的非递归遍历算法,两种版本 树的扩展前缀以及前缀中缀构建方法 源码 btree.cpp btree.h 基础知识 一.定义 二叉树的递归定义:二叉树是每个结点最多含有两棵 ...