Windows Socket TCP客户端每200ms只接收一次数据(QTCPSocket)

我正在使用QTCPSocket连接到一个TCP服务器(在Ubuntu上运行)。 服务器至less每40ms发送一个1字节的数据包。 我的应用程序是实时的,所以重要的是我以尽可能快的速度接收数据,而牺牲额外的networkingstream量。

一旦我从Windows连接了一个TCP客户端,我开始接收数据包。 但是, QTCPSocketreadyRead()信号每200ms只发送一次(包中有5个字节)。 我已经看过Wireshark中的数据包,它们实际上是5字节的数据包。

但是,在Mac上使用QTCPSocket (实际上是完全相同的代码),我每次都得到单独的数据包,我所有的1字节数据包都是以单字节数据包的forms发送的,这很好。

我试图创build一个原始的Windows套接字(不使用QTCPSocket ),并获得相同的行为,在Windows上的QTCPSocket

有什么区别导致Mac套接字以更高的时间分辨率接收数据包? 有什么我可以在setsockopt()设置,这将防止200毫秒的缓冲发生?

我知道,在服务器端设置TCP_NODELAY可能会解决我的问题,但看到作为Mac TCP客户端按预期工作,必须有办法在Windows上获得相同的行为。

设置mySocket-> setSocketOption(QAbstractSocket :: LowDelayOption,1); 在服务器端是唯一的办法,我已经找到了解决这个问题

对于那些偶然发现搜索引擎的人来说:

oggmonster的上述(正确)答案也可以描述为:

 int on = 1; if (setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (char*)&on, sizeof(on))) { return -1; } 

您需要确认您收到的每个字节的数据,以使答复能够确认一些数据。 与任何设计你的协议的人交谈。

试图回答“为什么在X而不在Y上工作”这样的问题只有在两种行为都不正确时才有用。 如果它没有应用程序级别的确认,那么这两种行为都是正确的。 如果其中一个不应该是正确的,那么协议应该有一个机制来控制,比如应用层确认。 如果没有协议被破坏。 试图找出为什么一个破碎的协议不起作用是毫无意义的 – 它不工作,因为它是坏的。