C++ C++;在Windows上禁用延迟确认

C++ C++;在Windows上禁用延迟确认,c++,sockets,tcp,winsock,C++,Sockets,Tcp,Winsock,我正试图在windows计算机上复制一个实时应用程序,以便能够调试并简化更改,但我遇到了延迟确认的问题。我已经禁用了nagle,并确认它可以稍微提高速度。当发送大量小数据包时,window不会立即确认,并将其延迟200毫秒。对此进行更多研究后,我发现。更改注册表值的问题在于,它将影响整个系统,而不仅仅是我正在使用的应用程序。是否仍然可以使用setsockopt从linux禁用窗口系统(如TCP\u QUICKACK)上的延迟确认?我努力编码12,但从WSAGetLastError得到了WSAEI

我正试图在windows计算机上复制一个实时应用程序,以便能够调试并简化更改,但我遇到了延迟确认的问题。我已经禁用了nagle,并确认它可以稍微提高速度。当发送大量小数据包时,window不会立即确认,并将其延迟200毫秒。对此进行更多研究后,我发现。更改注册表值的问题在于,它将影响整个系统,而不仅仅是我正在使用的应用程序。是否仍然可以使用
setsockopt
从linux禁用窗口系统(如
TCP\u QUICKACK
)上的延迟确认?我努力编码12,但从WSAGetLastError得到了WSAEINVAL

我在github上看到一些开发人员提到使用
SIO\u TCP\u SET\u ACK\u FREQUENCY
,但我没有看到任何关于如何实际使用它的示例

所以我试着在下面做

#define SIO_TCP_SET_ACK_FREQUENCY _WSAIOW(IOC_VENDOR,23) 
result = WSAIoctl(sock, SIO_TCP_SET_ACK_FREQUENCY, 0, 0, info, sizeof(info), &bytes, 0, 0);

我得到了WSAEFAULT作为错误代码。请帮忙

我在网上看到了一些参考资料,Winsock可能通过
setsockopt()
(opt 12)支持
TCP\u QUICKACK
,尽管没有文档记录,也没有在任何地方正式确认

但是,关于您的实际问题,您使用
SIO\u TCP\u SET\u ACK\u FREQUENCY
失败,因为您没有向
WSAIoctl()
提供任何输入缓冲区来设置实际频率值。试着这样做:

int freq = 1; // can be 1..255, default is 2
result = WSAIoctl(sock, SIO_TCP_SET_ACK_FREQUENCY, &freq, sizeof(freq), NULL, 0, &bytes, NULL, NULL);

请注意,Windows 7/Server 2008 R2及更高版本中提供了
SIO\u TCP\u SET\u ACK\u FREQUENCY

OMG!你太棒了。非常感谢你。这解决了我的问题。由于某些原因,SIO_TCP_SET_ACK_频率也适用于WIN7。考虑到默认等待时间为200ms。freq=1意味着什么?100毫秒?这是有道理的,因为默认值是2。顺便说一句,您可能正在以一种非常次优的方式解决外部问题。通常,通过修复应用程序级协议(例如,为ack提供了在数据上搭载的机会)而不是通过调整TCP来解决这个问题要好得多。以这种方式进行此操作的危险在于,您的网络效率要低得多,即使在负载较轻的网络上,也可能导致非常糟糕的结果。如果你只在完美的条件下进行测试,这似乎是一个完美的解决方案,但由于重要的原因,延迟ACK和Nagle的存在。谢谢David!现在,我将继续讨论这一点,因为实际的应用程序代码是在没有nagle/delayed ack的硬件上运行的,并且是在一个闭环中运行的。在我开始在windows上运行之前,这从来都不是问题。