首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

TCP缓存区的有关问题

2012-03-23 
TCP缓存区的问题我写了一个测试程序,客户端使用异步的send,服务端等待较长时间后再recv。用getsockopt获取

TCP缓存区的问题
我写了一个测试程序,客户端使用异步的send,服务端等待较长时间后再recv。用getsockopt获取客户端的发送缓冲区是8192,服务端的接收缓冲区是8192。我理解是:服务到哪没有recv,这时客户端先send后,将先写满服务端的接收缓冲区,然后再写满客户端的发送缓冲区,这时send返回-1。所以返回-1前发送的数据应该是小于等于8192+8192。但我测试的结果是,每次发送100个字节,结果send返回-1前,已经发了34300个字节了。这时服务端还没有recv,这是怎么回事?

[解决办法]
我还以为你用linux socket呢,原来是winsock……
1. WINDOWS socket有很多细节与linux socket是不同的。比如你遇到的这个。
2. 同样是winsock,不同版本间细节也有不同。你这用的是1.1,还有2.0, 2.2什么的。每版可能都有很多地方改进或者修正的。
3. 即使是用linux socket,也不能用你这个加法来判断。tcp buffer除了用户数据外,还会同时被一些内核结构占用,所以数字上只能大致上相等。更深的探究就得去挖TCP协议栈的实现源码了。

你这的情况可以参考MSDN上的解释。

SO_SNDBUF 
The total per-socket buffer space reserved for sends. This is unrelated to SO_MAX_MSG_SIZE and does not necessarily correspond to the size of a TCP send window.

SO_RCVBUF
The total per-socket buffer space reserved for receives. This is unrelated to SO_MAX_MSG_SIZE and does not necessarily correspond to the size of the TCP receive window. 

红字两句,说明了windows实现socket buffer时还隐藏了一些细节。
所以你不能用这个策略来探测tcp window size。你的“加法”理论上就不成立。
要探究TCP层到底在怎样工作,最好的的办法是抓包。

热点排行