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

时间:2013-02-15 14:36:41

标签: windows macos qt sockets tcp

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

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

但是,在Mac上使用QTCPSocket(事实上完全相同的代码),我每次都会获得单个数据包,我发送的所有1字节数据包都以单字节数据包形式到达,这很棒。

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

Mac套接字以更高的时间分辨率接收数据包有什么区别?我可以在QTCPSocket中设置一些可以防止200ms缓冲发生的事情吗?

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

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:-1)

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

尝试回答诸如“为什么它在X而不在Y上工作”这样的问题仅在两种行为都不正确时才有用。如果它没有应用程序级别的确认,那么这两种行为都是正确的。如果其中一个不正确,那么协议应该有一个控制它的机制,例如应用层确认。如果没有,协议就会被破坏。试图弄清楚为什么破坏的协议不起作用是没有意义的 - 它不起作用,因为它已经坏了。