Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets SO_RCVBUF如何小于TCP接收窗口?(Windows XP)_Sockets_Windows Xp_Tcp_Winsock - Fatal编程技术网

Sockets SO_RCVBUF如何小于TCP接收窗口?(Windows XP)

Sockets SO_RCVBUF如何小于TCP接收窗口?(Windows XP),sockets,windows-xp,tcp,winsock,Sockets,Windows Xp,Tcp,Winsock,我有一个在Windows XP上使用TCP的应用程序。当我使用SO_RCVBUF选项调用getsockopt时,它报告8192字节。然而,Wireshark显示该应用程序的接收缓冲区为64K。这怎么可能?要有64K接收窗口,它不需要64K缓冲区吗?有两种不同的缓冲区吗?您自己设置窗口大小吗?确保在连接(2)或接受(2)之前执行此操作。但是windows在这方面可能也很特别,请检查。我正在研究这个问题,我不认为所以_RCVBUF和TCP窗口一定是同一件事 如果您查看“Windows NT和Wind

我有一个在Windows XP上使用TCP的应用程序。当我使用SO_RCVBUF选项调用getsockopt时,它报告8192字节。然而,Wireshark显示该应用程序的接收缓冲区为64K。这怎么可能?要有64K接收窗口,它不需要64K缓冲区吗?有两种不同的缓冲区吗?

您自己设置窗口大小吗?确保在连接(2)或接受(2)之前执行此操作。但是windows在这方面可能也很特别,请检查。

我正在研究这个问题,我不认为
所以_RCVBUF
和TCP窗口一定是同一件事

如果您查看“Windows NT和Windows 2000套接字体系结构”一节,您会看到Windows内核套接字驱动程序Afd.sys位于传输协议之上。它有自己的套接字
SND
/
RCV
缓冲区,这些缓冲区是您在套接字选项
SO_SNDBUF
SO_RCVBUF
或通过Afd注册表项设置的。 然后,TCP传输协议有自己的TCP窗口缓冲区,这是每个人都熟悉的缓冲区,可以在注册表Tcpip参数中设置,也可以自动确定,同时考虑到其他因素,所以我认为这是产生混淆的原因

因此,我相信数据会根据需要从传输层读取到afd.sys套接字缓冲区
So_RCVBUF
,等待应用程序读取。您希望
SO_RCVBUF
至少与您希望一次读取的数据一样大


但是,我不知道
sorcvbuf
和TCP窗口将如何相互作用。TCP是否会等待确认数据,直到它被读入
中?我不清楚。

不,我没有自己设置窗口或缓冲区。但不管是谁设置的大小,我不明白如果它只有8K的内存来保存传入的数据,它怎么能宣传64K接收窗口。可能winsock只是在骗你。在windows下,64K似乎是比100Mbps更快的默认连接。