2

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

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

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

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

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

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

4

3 回答 3

0

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

于 2013-02-21T11:23:44.317 回答
0

对于其他偶然发现来自搜索引擎的人:

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

int on = 1;
if (setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (char*)&on, sizeof(on)))
  {
  return -1;
  }
于 2016-10-01T19:34:45.700 回答
-1

您需要确认收到的每个数据字节,以向回复 ACK 提供一些数据以供捎带。与设计您的协议的人交谈。

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

于 2013-02-15T14:38:22.647 回答