如何判断TCP包是否发送成功
来源:互联网 发布:python pillow 安装 编辑:程序博客网 时间:2024/06/16 05:05
原文地址: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的字节数,
a. 那么阻塞模式会进行阻塞,等待内核缓冲的空闲空间,然后继续将数据拷贝到内核缓冲中,直到全部拷贝为止。返回rn即为data的数据量。
b. 非阻塞模式,当内核发送缓冲被填满后,立即返回。rn等于data中已被拷贝到发送缓冲的数据量。
3. 如何判定接收成功接收数据?
1.接收端回复应答信息。
这个方法比较土,但也是比较实用的。
2.计算发送端sock已发送数据量
可参考:如何判断TCP数据包是否发送成功 作者提到可以使用 ioctl接口:ioctl(tcp_socket, SIOCOUTQ, &value);
- 如何判断TCP包是否发送成功
- 如何判断TCP数据包是否发送成功
- 如何判断android 短信发送(sendTextMessage)是否成功
- 如何判断android 短信发送(sendTextMessage)是否成功
- 发送短信及其判断是否发送成功
- java mail 发送邮件,并判断是否发送成功
- c#中如何判断查找是否成功
- 如何判断statement插入是否成功
- 如何判断statement插入是否成功
- opencv如何判断图片是否加载成功
- mongodb如何判断一次操作是否成功
- 如何判断smmu是否初始化成功呢?
- 如何判断hibernate 存储数据是否成功
- android群发短信时判断短信是否发送成功
- android判断短信是否发送成功[动态注册广播]
- libevent异步TCP连接,判断是否连接成功
- 如何判断配置的JDK和AndroidSDK是否成功
- shell 中如何判断前一个命令是否执行成功
- 带有分割线的GridView九宫格的完美实现
- Vuforia SDK---- AR开发vuforiaARCamera动态修改最大识别量
- 缓存方案之Redis
- 懒加载
- Java 虚拟机体系结构
- 如何判断TCP包是否发送成功
- java基础回顾与进阶
- JavaScript读取本地json文件
- 面向对象思想
- 大学最重要的七项学习
- 坑爹的stl list 的size()成员函数
- 文件预览后续
- wifi 链接流程
- [leetcode]median of two sorted arrays【寻找第k小的数问题】