SO_SNDBUF和SO_RCVBUF都是8192,接收方不接收,为什么发送方会是在发送33K字节后阻塞?这个33K是怎么回事?
建立连接后,发送方每次发送1024字节,而接收方不接收数据,为什么发送方在发送了32K数据之后,select才会阻塞?之前select都返回可写。
int iSend=0;
年int iSize=64*1024;
fd_set fdWrite;
while(iSend<iSize)
{
FD_ZERO(&fdWrite);
FD_SET(s,&fdWrite);
timeval tv={0,1};
if(1==select(0,NULL,&fdWrite,NULL,&tv))
iSend+=send(s,(char*)ar,iPerSize,0);
else
TRACE("Blocked. already send %d\n",iSend);
}
接收方在建立连接之后不调用recv。为什么发送方总是在发送33792字节后阻塞?哪位帮忙解释一下,为什么会是33792字节?
本机测试,windows2003+sp1
问题点数:100、回复次数:7Top
1 楼nuaawenlin(飘人)回复于 2005-12-22 19:09:58 得分 60
tcp有自己的滑动窗口算法
在窗口没有满之前,都可以发送
并且send只是把数据从用户缓冲区拷贝到系统缓冲区。
然后tcp根据滑动窗口算法将系统缓冲区中的数据发送出去
由于对方没有recv,所以造成了拥塞。达到滑动窗口大小(一般为16k)时,对方tcp回复的接收窗口为0,通知发送方由于拥塞,无法进行继续发送。
而此时发送方已经向接收方发送了16k的数据。发送方自己又有16k的发送窗口区间。
所以当你发送到32k时,send将会返回发送窗口为0的错误Top
2 楼lsgt(天下第七)回复于 2005-12-23 10:07:23 得分 0
谢谢。不过阻塞不是在32K,而是在发送了33K(33792)字节后。即以上代码的iSend=33792。
Top
3 楼lifengice0706(无)回复于 2005-12-23 14:21:01 得分 0
改改reg里的滑动窗口试试!TcpwindowSize,记着好像是在大于64K后,还要加入Tcp1323opts (DWORD 3)。记不清了,可上网查查!Top
4 楼lifengice0706(无)回复于 2005-12-23 14:28:00 得分 0
改reg试试,滑动窗口TcpWindowSize,好像是大于64K时,还要加Tcp1323Opts (DWORD 3)。你可上网查查!Top
5 楼lsgt(天下第七)回复于 2005-12-26 08:18:50 得分 0
我不是想改动这个值,就是想知道为什么会是33K,哪位给解释一下?Top
6 楼softrain(曾经的月光,现在的日光)回复于 2005-12-26 14:11:20 得分 40
发送32K肯定是不会告诉你窗口阻塞,当你再发送第33K的IP分片时,就会告诉你发送被阻塞.
你可以这样试试,先发送32K,对方不接收,再发送1个字节,系统应该就会告诉你发送被阻塞了.Top
7 楼lsgt(天下第七)回复于 2005-12-28 10:15:13 得分 0
SORRY,我搞错了,softrain(敢笑杨过不痴情) 和 nuaawenlin(飘人) 是对的。Top




