如何判断TCP数据包是否发送成功
来源:互联网 发布:淘宝上的喵喵通讯 编辑:程序博客网 时间:2024/06/05 14:09
/* Linux-specific socket ioctls */#define SIOCINQ FIONREAD#define SIOCOUTQ TIOCOUTQ#define SIOCATMARK _IOR('s', 7, int)一个应用程序可以使用SIOCATMARK ioctlsocket()命令来确定在记号之前是否还有未读入的数据。应用程序可以使用这一记号与其对方进行重新同步。
SIOCINO 能得到未读的数据 只对TCP SOCKET int value; error = ioctl(unix_socket, ioctl_type, &value); ioctl_type can be: SIOCINQ For SOCK_STREAM socket the function returns the amount of queued unread data in the receive buffer. The socket must not be in LISTEN state, otherwise an error (EINVAL) is returned. SIOCINQ is defined in <linux/sockios.h>. Alternatively, you can use the synonymous FIONREAD, defined in <sys/ioctl.h>. For SOCK_DGRAM socket, the returned value is the same as for Internet domain datagram socket; see udp(7).
/* Linux-specific socket ioctls */#define SIOCINQ FIONREAD#define SIOCOUTQ TIOCOUTQ#define SIOCATMARK _IOR('s', 7, int)一个应用程序可以使用SIOCATMARK ioctlsocket()命令来确定在记号之前是否还有未读入的数据。应用程序可以使用这一记号与其对方进行重新同步。
SIOCINO 能得到未读的数据 只对TCP SOCKET
int value; error = ioctl(unix_socket, ioctl_type, &value); ioctl_type can be: SIOCINQ For SOCK_STREAM socket the function returns the amount of queued unread data in the receive buffer. The socket must not be in LISTEN state, otherwise an error (EINVAL) is returned. SIOCINQ is defined in <linux/sockios.h>. Alternatively, you can use the synonymous FIONREAD, defined in <sys/ioctl.h>. For SOCK_DGRAM socket, the returned value is the same as for Internet domain datagram socket; see udp(7).
如何判断TCP数据包是否发送成功
(2013-11-02 22:44:01)转载▼
标签:
问题描述:socket编程,发送少量数据时,send/write等发送函数会立即返回成功,发送的数据会存在TCP发送缓冲区中,依靠TCP协议栈自身的重传机制来保证该数据 被接收端收到;我们的问题是 发送端应用程序 如何判断 少量数据 已经成功发送到接收端?tcp数据发送
成功
tcp
分类:tcpip解决思路:发送数据存在缓冲区中,我们判断发送缓冲区大小变化,即可获知发送是否成功;具体方法如下:发送数据后,获得已使用缓冲区大小buf,如果buf==0,表示成功,否则,表示未发送;
那么,如何来获得当前已占用发送缓冲区大小?
1. 第一步我们自然想到是否存在这样的sockopt接口
getsockopt(clientSocket,
但经过试验,我们发现 无论数据是否发送成功,该值一直不变;
查看内核代码,发现 该参数的含义是 总共的发送缓冲区,包括 已占用 和 空闲的;
2. 第二步,我们发现/proc/net/tcp
/proc/net/tcp 中tx_queue 的计算:“tp->write_seq - tp->snd_una”,根据该计算方法,在内核源码中查找,发现内核导出了2个获得已使用发送缓冲的编程接口;
- ioctl接口:ioctl(tcp_socket,
SIOCOUTQ, &value); - netlink接口:socket(AF_NETLINK,SOCK_RAW, NETLINK_TCPDIAG);获得structtcpdiagmsg结构体数据,其中,tcpdiag_wqueue即已占用发送缓冲区大小;
ps:ioctl接口已经实验验证可用,netlink尚未验证,可参考http://linux.chinaunix.net/techdoc/develop/2006/10/15/942169.shtml;
0 0
- 如何判断TCP数据包是否发送成功
- 如何判断TCP包是否发送成功
- 如何判断android 短信发送(sendTextMessage)是否成功
- 如何判断android 短信发送(sendTextMessage)是否成功
- 发送短信及其判断是否发送成功
- 发送TCP数据包
- java mail 发送邮件,并判断是否发送成功
- c#中如何判断查找是否成功
- 如何判断statement插入是否成功
- 如何判断statement插入是否成功
- opencv如何判断图片是否加载成功
- mongodb如何判断一次操作是否成功
- 如何判断smmu是否初始化成功呢?
- 如何判断hibernate 存储数据是否成功
- android群发短信时判断短信是否发送成功
- android判断短信是否发送成功[动态注册广播]
- 如何发送icmp数据包
- 网卡如何发送数据包
- Session 'app': Error Launching activity
- Redis的介绍及使用实例.
- [常见问题]在Linux下执行Redis命令不起作用.
- [Linux]Linux下redis的安装及配置.
- [Linux]Linux下安装和配置solr/tomcat/IK分词器 详细实例二.
- 如何判断TCP数据包是否发送成功
- [Linux]Linux下安装和配置solr/tomcat/IK分词器 详细实例一.
- [Linux] linux下安装配置 zookeeper/redis/solr/tomcat/IK分词器 详细实例.
- Solr的原理及在项目中的使用实例.
- BinaryWatch[LeetCode]
- ActiveMQ的介绍及使用实例.
- jquery中的$("#id")与document.getElementById("id")的区别
- 页面静态化技术Freemarker技术的介绍及使用实例.
- 集群下session共享问题的解决方案.