Windows套接字TCP客户端仅每200ms接收一次数据(QTCPSocket)

Windows套接字TCP客户端仅每200ms接收一次数据(QTCPSocket),windows,macos,qt,sockets,tcp,Windows,Macos,Qt,Sockets,Tcp,我正在使用qtcsocket连接到TCP服务器(在Ubuntu上运行)。服务器至少每40毫秒发送一个1字节的数据包。我的应用程序是实时的,因此以额外的网络流量为代价尽可能快地接收数据非常重要 一旦我从Windows连接了TCP客户端,我就开始接收数据包。但是,来自qtcsocket的readyRead()信号仅每200ms发出一次(数据包中有5个字节)。我看过Wireshark中的数据包,它们实际上是5字节的数据包 然而,在Mac上使用QTCPSocket(事实上代码完全相同),每次我都会收到单

我正在使用
qtcsocket
连接到TCP服务器(在Ubuntu上运行)。服务器至少每40毫秒发送一个1字节的数据包。我的应用程序是实时的,因此以额外的网络流量为代价尽可能快地接收数据非常重要

一旦我从Windows连接了TCP客户端,我就开始接收数据包。但是,来自
qtcsocket
readyRead()
信号仅每200ms发出一次(数据包中有5个字节)。我看过Wireshark中的数据包,它们实际上是5字节的数据包

然而,在Mac上使用
QTCPSocket
(事实上代码完全相同),每次我都会收到单独的数据包,我发送的所有1字节数据包都以单字节数据包的形式到达,这很好

我尝试创建一个原始Windows套接字(不使用
qtcsocket
),并在Windows上获得与
qtcsocket
相同的行为

导致Mac套接字以更高的时间分辨率接收数据包的区别是什么?我是否可以在
setsockopt()
中设置一些东西来防止发生这种200ms缓冲


我知道在服务器端设置
TCP\u NODELAY
可能会解决我的问题,但鉴于Mac TCP客户端按预期工作,必须有一种方法在Windows上获得相同的行为。

您需要确认接收到的每个字节的数据,以便为应答提供一些数据以供携带。和设计你的协议的人谈谈


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

你需要确认你收到的每个字节的数据,以便给回复回一些数据以供携带。和设计你的协议的人谈谈


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

设置mySocket->setSocketOption(QAbstractSocket::lowdayoption,1);在服务器端是我发现的解决此问题的唯一方法

设置mySocket->setSocketOption(QAbstractSocket::lowdayoption,1);服务器端是我发现的唯一解决这个问题的方法

对于那些从搜索引擎中偶然发现这个问题的人:

上述(正确)答案也可通过以下方式描述:

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

对于从搜索引擎中偶然发现这一点的其他人:

上述(正确)答案也可通过以下方式描述:

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

设置
mySocket->setSocketOption(QAbstractSocket::lowdayoption,1)在服务器端是我找到的唯一解决此问题的方法。您是否尝试先修复协议?TCP是一种流媒体协议。UDP对于这种用法可能更好。@Roku:不太可能,因为他必须自己处理重传、复制、传输速度等。如果TCP做了一些您不需要的昂贵事情,那么UDP是一个更好的选择。但是,如果你的想法是“我可以做TCP做的一切,但不知何故会做得更好”,那就忘了它。这取决于环境和可靠性要求。如果环境是一个低负载的局域网,并且如果应用程序每月错过一次数据包并不是致命的,那么UDP是可以实现的。当然,尝试在UDP之上构建自己的TCP是不明智的。您只需要知道这些协议是如何工作的,您自己的需求,并相应地进行选择在服务器端是我找到的唯一解决此问题的方法。您是否尝试先修复协议?TCP是一种流媒体协议。UDP对于这种用法可能更好。@Roku:不太可能,因为他必须自己处理重传、复制、传输速度等。如果TCP做了一些您不需要的昂贵事情,那么UDP是一个更好的选择。但是,如果你的想法是“我可以做TCP做的一切,但不知何故会做得更好”,那就忘了它。这取决于环境和可靠性要求。如果环境是一个低负载的局域网,并且如果应用程序每月错过一次数据包并不是致命的,那么UDP是可以实现的。当然,尝试在UDP之上构建自己的TCP是不明智的。您只需要知道这些协议是如何工作的,您自己的需求,并做出相应的选择。