Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ QTcpSocket:设置LowDelayOption似乎没有效果?_C++_Qt_Sockets_Tcp - Fatal编程技术网

C++ QTcpSocket:设置LowDelayOption似乎没有效果?

C++ QTcpSocket:设置LowDelayOption似乎没有效果?,c++,qt,sockets,tcp,C++,Qt,Sockets,Tcp,我有一个QtGUI应用程序,它使用qtcSocket向服务器发送和接收TCP数据包。到目前为止,我已经成功地实现了TCP套接字连接(有两个单独的套接字连接,因为有两个不同的消息集。两个端口号相同,但有两个不同的端口号)和发送和接收数据包。我的应用程序发送的大多数消息都是通过GUI主窗口上的按钮启动的(一条消息使用QTimer定期发送,每1667ms过期一次) 服务器有一个FIFO(128条消息深),并向我的应用程序发送一条特定消息,该消息在FIFO满1/2、满3/4和满时进行通信。通过在GUI上

我有一个QtGUI应用程序,它使用qtcSocket向服务器发送和接收TCP数据包。到目前为止,我已经成功地实现了TCP套接字连接(有两个单独的套接字连接,因为有两个不同的消息集。两个端口号相同,但有两个不同的端口号)和发送和接收数据包。我的应用程序发送的大多数消息都是通过GUI主窗口上的按钮启动的(一条消息使用QTimer定期发送,每1667ms过期一次)

服务器有一个FIFO(128条消息深),并向我的应用程序发送一条特定消息,该消息在FIFO满1/2、满3/4和满时进行通信。通过在GUI上捣乱send按钮来测试这一功能是很乏味的,所以我想到了加载一个可以预先填充的.csv文件(消息有几个不同的可配置参数)来发送我想要的内容。每一行都会被读取并转换为消息,然后通过TCP套接字发送

单击GUI上的按钮时,我会在主窗口中打开一个QFileDialog。然后,当一个.csv文件被导航到并选中时,该函数一次读取一行.csv文件,取出所有单独的参数,用参数填充消息,然后将其发送到套接字。每条消息有28个字节。它会重复此操作,直到.csv文件中没有任何行

我在Wireshark上注意到的是,它们不是发送一堆单独的TCP数据包,而是被放在一起作为一个大的TCP数据包发送

当我第一次测试它时,我不知道lowdayoption,所以当我在QAbstractSocket的文档中找到关于它的信息时,我想“啊哈!一定是它!我的问题的解决方案!”但当我将它添加到我的代码中时,它似乎没有任何效果。它仍然作为一个大型TCP数据包发送。对于每个套接字,我调用setSocketOption将插槽函数中的lowdayoption设置为1,该插槽函数接收来自套接字的connected()信号。我想可能是setSocketOption调用不起作用,所以我通过调用socketOption来检查它,以获取lowdayoption的值,它是1

我还有别的事要做吗?我做错什么了吗

谢谢你的时间和帮助。如果有问题,我正在Windows上开发此软件,并且使用文档中的Qt 5.9.1

TCP(传输控制协议)是一种可靠的、面向流的、面向连接的传输协议。它特别适合于数据的连续传输

流定向意味着在UDP套接字中没有类似数据报的东西。 只有数据流,您永远不知道它将在哪个部分发送

TCP协议只提供可靠性,您必须自己提供消息提取。即在每条消息之前发送消息长度,或使用
QDataStream
(检查 举例来说)



lowdayoption
from

尝试优化套接字以降低延迟。对于QTcpSocket,这将设置TCP_节点延迟选项并禁用。将此设置为1以启用。

它与
TCP\u节点延迟
option
第一件事是:

TCP_节点延迟选项特定于TCP/IP服务提供商

这对我也不起作用:)


表示他们不建议禁用Nagle的算法:

强烈建议TCP/IP服务提供商在默认情况下启用Nagle算法,对于绝大多数应用程序协议,Nagle算法可以提供显著的性能增强。但是,对于某些应用程序,该算法可能会影响性能,可以使用TCP_节点延迟来关闭它。这些应用程序发送许多小消息,并保持消息之间的时间延迟。应用程序编写者不应设置TCP_节点延迟,除非这样做的影响已被充分理解和期望,因为设置TCP_节点延迟可能会对网络和应用程序性能产生显著的负面影响


问题是:您真的需要尽快发送邮件吗? 如果是,请考虑使用。也许可以告诉我们更多关于您发送的消息

。。。向服务器发送和从服务器发送TCP数据包

从这一点上,我感觉到您的应用程序依赖于一定数量的数据——在单个接收呼叫中接收“数据包”

你不能真的相信这一点。您通过TCP发送的数据也可能在途中被分割。此外,在接收端TCP实现中,在读取第一个数据包之前,可能会将从网络接收的多个数据包放入接收套接字缓冲区中,并且您无法知道这些数据包最初是以何种形式发送的

因此,您应该将TCP视为一个管道,通过该管道,数据字节将以未知且可能可变的延迟流动。这种可变延迟会导致数据随机地以较大或较小的块接收

如果你想有一个数据包结构,你应该在你传输的数据中添加一个至少包含数据包长度的数据包头


我希望这会有所帮助。

除了设置LowDelayOption外,您是否尝试在每次发送后调用flush()?@JamesKPolk在每次发送后调用flush()似乎都能奏效。在查看QAbstractSocket类的Qt文档时,我不知怎么错过了这个函数。非常感谢。然而,有时在Wireshark上,我会看到“快速重传”。我必须仔细阅读TCP,看看为什么会这样。