QTCPSOCTED:设置LowDelayOption似乎没有效果
QTcpSocket: Setting LowDelayOption seems to have no effect?
我有一个QT GUI应用程序,该应用程序使用 QTCPSOCTED 将TCP数据包发送和从服务器接收TCP数据包。到目前为止,我已经成功地建立了TCP套接字连接(有2个单独的套接字连接,因为有2个不同的消息集。两个不同的端口编号以外的IP地址相同)以及发送和接收数据包。我的应用程序发送的大多数消息都是通过GUI主窗口上的Push-button启动的(使用QTimer定期发送一条消息,该QTIMER每1667ms到期)。
服务器具有FIFO(深128条消息),并向我的应用程序发送一条特定的消息,该消息在FIFO满足1/2时通信,完整且完整。只需将GUI上的"发送"按钮捣碎,因此我有一个可以预先填写的.CSV文件(该消息具有几个不同的可配置参数),这是乏味的。每行都会被读取并变成一条消息,并在TCP插座上发送。
从我的主窗口中,当单击GUI上的按钮时,我打开 qfiledialog 。然后,当一个.csv文件被导航到并选择该函数时一次读取.csv文件一行,从而删除所有各个参数,将消息填写为参数,然后将其发送到套接字上。每个消息为28个字节。它重复此操作,直到.csv文件中没有线。
我在Wireshark上注意到的是,而不是发送一堆单独的TCP数据包,而是将它们都放在一起并作为一个大型TCP包装发送。
首次测试此问题时,我不知道 lowdelayoption 因此,当我在文档中找到有关它的信息时, qabstractsocket >好吧!解决我的问题!"但是,当我将其添加到代码中时,它似乎根本没有任何效果。它仍被发送为一个大型TCP数据包。对于每个插座,我都在调用 setSocketOption 将 lowdelayoption 设置为插槽函数中的1,该功能接收 connected()connected()信号。我以为也许 setSocketOption 呼叫不起作用,所以我通过调用 socketOption 来检查此问题,以获取 lowdelayoption 的值,然后是1. <<
我还需要做其他事情吗?我做错了吗?
感谢您的时间和帮助。如果很重要,我正在Windows上开发它,并且我正在使用QT 5.9.1
...发送和从服务器发送和TCP数据包。
由此我得到您的应用程序依赖一定数量的数据的氛围 - 单个接收电话中收到的"数据包"。
您不能真正依靠它。您通过TCP发送的数据也可以在途中分散。同样,在您的接收端TCP实现中,从网络接收的多个数据包可能会在您阅读第一个的接收插座缓冲区中,并且您无法告诉他们最初发送的哪种片段。
。因此,您应该将TCP视为管道,通过该管道,数据流的数据流具有一些未知且可能可变的延迟。该可变延迟导致随机收到更大或较小的块中的数据。
如果要拥有一个数据包结构,则应在传输数据中添加至少包含数据包长度的数据包标头。
我希望这会有所帮助。
来自qtcpsocket文档:
TCP(传输控制协议)是一种可靠的,面向连接的传输协议的可靠,。它特别适合连续传输数据。
stream-orientet意味着UDP插座中没有类似的数据报。只有数据流,您永远不知道将发送什么部分。
TCP协议仅提供可靠性,您必须自己提供消息提取。即在每条消息之前发送消息长度,或使用QDataStream
(检查财富服务器和财富客户端以示例)。
LowDelayOption
来自qabstractsocket :: socketOption
尝试优化低潜伏期的套接字。对于qtcpsocket,这将设置TCP_NODELAY选项并禁用Nagle的算法。将此设置为1启用。
它等于setSockopt,带有TCP_NODELAY
选项
首先是:
TCP_NODELAY选项特定于TCP/IP服务提供商。
,它也对我不起作用:)
MSDN说他们不建议禁用Nagle的算法:
强烈建议TCP/IP服务提供商默认情况下启用Nagle算法,而对于绝大多数应用程序协议,Nagle算法可以提供显着的性能增强功能。但是,对于某些应用,该算法可能会妨碍性能,并且可以使用TCP_Nodelay将其关闭。这些是发送许多小消息的应用程序,并维持消息之间的时间延迟。应用程序作者不应设置TCP_NODELAY,除非这样做的影响是有充分理解和需要的,因为设置TCP_Nodelay可能会对网络和应用程序性能产生重大的负面影响。
问题是:您是否真的需要尽快发送消息?如果是,请考虑使用qudpsocket。也许告诉我们有关您发送的消息的更多信息。
- 警告处理为错误这里有什么问题
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 2D数组来自文本输入,中间有空格
- 函数向量_指针有不同的原型,我可以构建一个吗
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- 有根的二进制搜索树.保留与其父级的链接
- 在计算中使用二的幂有多有利可图
- 有什么方法可以遍历结构吗
- 函数中堆分配的效果与缺少堆分配的情况
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 有充分的理由在h文件中使用include保护而不是cpp文件吗
- 有一个打印语句的函数是一种糟糕的编程实践吗
- unique_ptr:在分配之前调用 reset 有什么效果
- 有提升一些东西到 fsync() 的效果
- 如何在C中获取char阵列的第一个X元素?提升效果是否有改进的方法
- 我怎样才能制作出具有电视效果的图像
- 我怎样才能有默认参数的效果与可变模板
- 有没有一种方法可以反转QWidget::setMask()函数或实现类似的效果