我正在运行Linux中运行2.6.9-55.ELsmp,x86_64的。

我试图设置TCP接收窗口通过使用setsockopt()函数使用C.我尝试以下方法:

rwnd = 1024;
setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (char *)&rwnd, sizeof(rwnd));

上面的代码段中,从服务器接收数据的客户端程序。当我开球的程序来接收,并观察tcpdump的输出,我观察窗谈判像这样:

11:34:40.257755 IP clientReceiver.42464 > serverSender.8991: 
S 1742042788:1742042788(0) win 5840 
<mss 1460,sackOK,timestamp 1688222886 0,nop,wscale 2>

我们看到,客户端程序其实是在谈判从我的客户端程序都设置不同的窗口。然而,我怎么能解释史蒂芬的文本(“TCP / IP详解卷1”)第20.4节,我相信你影响他指的是第二块引用什么第20.4节使用setsockopt()调用我使用(见上文)。

我想明白的地方我已经错了。

也许我什么史蒂文斯说的解释是不正确。在这种情况下,你可以点我到设置接收缓冲区大小的正确方法是什么?由于我的困惑的证明,我是指在Linux TCP套接字手册页在 HTTP://linux.die达网络/人/ 7 / TCP (见SO_RCFBUF注释)。

那我在这个故事里缺少什么?我如何控制接收缓冲区的大小(并将其显示在tcpdump的输出)?请注意,我指给这里的套接字选项SO_RCFBUF的设置 - 我明白那是在SYN窗口谈判中显示的内容。

任何输入被理解。

有帮助吗?

解决方案

您也需要使用TCP_WINDOW_CLAMP

rcvbuf = 2048;
setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (char *)& rcvbuf, sizeof(rcvbuf));
clamp = 1024;
setsockopt(sock, SOL_SOCKET, TCP_WINDOW_CLAMP, (char *)& clamp, sizeof(clamp));

请注意的是rcvbuf夹具两次,也可能是更。你可以让它自动调谐,窗夹具仍然可以工作。这不是便携式的。

其他提示

您可以在任何时间增加它 -

在接收缓冲区大小可以只连接前插座被减小。为了什么你叫相对sockopt的()进行连接()?

有关TCP,所述RWND值的recv时进行传递。

的recv(袜子,BUF,RWND,0);

此应接受1024个字节。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top