C++ QTcpSocket:设置LowDelayOption似乎没有效果?
我有一个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协议只提供可靠性,您必须自己提供消息提取。即在每条消息之前发送消息长度,或使用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上
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,看看为什么会这样。