2013-02-15 201 views
2

我使用QTCPSocket连接到TCP服务器(它运行在Ubuntu上)。服务器至少每40ms发送一个1字节的数据包。我的应用程序是实时的,所以重要的是我尽可能快地接收数据,但需要额外的网络通信量。Windows套接字TCP客户端每200毫秒接收一次数据(QTCPSocket)

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

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

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

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

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

+0

设置'mySocket-> setSocketOption(QAbstractSocket :: LowDelayOption,1);'在服务器端是我发现的唯一方法来解决这个问题 – oggmonster 2013-02-15 15:48:23

+0

您尝试先修复协议?因为这对我来说一直都很有用。 – 2013-02-15 16:53:21

+0

TCP是一个流媒体协议。对于这种用法,UDP可能会更好。 – 2013-02-15 20:17:06

回答

0

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

-1

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

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

0

对于其他人在这个谁绊倒从搜索引擎来的唯一方法:

通过oggmonster以上(正确)的答案也被描述为:

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