如何获取SOCKET 发送缓冲区使用大小
来源:互联网 发布:保定移动网络太垃圾 编辑:程序博客网 时间:2024/06/10 01:39
问题描述:socket编程,发送少量数据时,send/write等发送函数会立即返回成功,发送的数据会存在TCP发送缓冲区中,依靠TCP协议栈自身的重传机制来保证该数据 被接收端收到;我们的问题是 发送端应用程序 如何判断 少量数据 已经成功发送到接收端?
解决思路:发送数据存在缓冲区中,我们判断发送缓冲区大小变化,即可获知发送是否成功;具体方法如下:发送数据后,获得已使用缓冲区大小buf,如果buf==0,表示成功,否则,表示未发送;
那么,如何来获得当前已占用发送缓冲区大小?
1. 第一步我们自然想到是否存在这样的sockopt接口
解决思路:发送数据存在缓冲区中,我们判断发送缓冲区大小变化,即可获知发送是否成功;具体方法如下:发送数据后,获得已使用缓冲区大小buf,如果buf==0,表示成功,否则,表示未发送;
那么,如何来获得当前已占用发送缓冲区大小?
1. 第一步我们自然想到是否存在这样的sockopt接口
getsockopt(clientSocket, SOL_SOCKET, SO_SNDBUF, (void*)&sendbuflen, &len);
getsockopt中,有参数SO_SNDBUF,貌似是用来获得发送缓冲大小的;
但经过试验,我们发现 无论数据是否发送成功,该值一直不变;
查看内核代码,发现 该参数的含义是 总共的发送缓冲区,包括 已占用 和 空闲的;
2. 第二步,我们发现/proc/net/tcp中tx_queue大小,即已占用发送缓冲区大小
但经过试验,我们发现 无论数据是否发送成功,该值一直不变;
查看内核代码,发现 该参数的含义是 总共的发送缓冲区,包括 已占用 和 空闲的;
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
- 如何获取SOCKET 发送缓冲区使用大小
- 如何获取/设置socket对应的内核缓冲区(发送,接收)的大小
- socket之send与发送缓冲区大小的关系
- socket对应的内核缓冲区(发送,接收)的大小
- 设置socket缓冲区大小
- socket缓冲区大小设置
- socket缓冲区大小设置
- 设置socket缓冲区大小
- socket缓冲区大小
- 设置socket缓冲区大小
- socket缓冲区大小 .
- socket 缓冲区大小设置
- ubuntu 获取到的发送接收缓冲区大小有奇怪!
- socket 发送缓冲区问题
- 获取缓冲区的大小
- 获得socket的缓冲区大小
- linux socket 缓冲区默认大小
- linux 默认socket 缓冲区大小
- js获取浏览器窗口宽高
- 配置debug出错 Transport dt_socket failed to initialize, rc = 509.
- win8 wamp无法进入phpMyAdmin或localhost的解决方法
- LSB算法BMP图片信息隐藏技术 c语言
- HDFS的接口(命令行接口和Java接口)--笔记
- 如何获取SOCKET 发送缓冲区使用大小
- MQTT协议简记
- win10+vs2015缓冲区溢出实验
- CocoaPods的坑
- linux 常用命令三
- web前端开发中浏览器兼容问题(四)
- 在这个不公平的世界,你要输得起。
- Why you should use talloc for your next project
- ajax回调方法的使用