Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.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++ TCP数据包有时会合并(并延迟?)_C++_C_Sockets_Networking_Tcp - Fatal编程技术网

C++ TCP数据包有时会合并(并延迟?)

C++ TCP数据包有时会合并(并延迟?),c++,c,sockets,networking,tcp,C++,C,Sockets,Networking,Tcp,我每500毫秒将数据包从服务器发送到客户端,反之亦然,以表明连接仍处于活动状态。然而,有时这些数据包被延迟,多个数据包被组合在一起。问题是,这将导致“连接超时”,而这可能只是一个延迟 在任何现代互联网连接上,包发送的10秒延迟对我来说都相当长。有没有办法解决这个问题 在服务器和客户机上发送和接收消息,如下例所示,其中最终接收的数据包由多个数据包组合而成。这在服务器和客户机上同时发生 SENT ALIVE PACKET RECEIVED ALIVE PACKET SENT ALIVE PACKET

我每500毫秒将数据包从服务器发送到客户端,反之亦然,以表明连接仍处于活动状态。然而,有时这些数据包被延迟,多个数据包被组合在一起。问题是,这将导致“连接超时”,而这可能只是一个延迟

在任何现代互联网连接上,包发送的10秒延迟对我来说都相当长。有没有办法解决这个问题

在服务器和客户机上发送和接收消息,如下例所示,其中最终接收的数据包由多个数据包组合而成。这在服务器和客户机上同时发生

SENT ALIVE PACKET
RECEIVED ALIVE PACKET
SENT ALIVE PACKET
RECEIVED ALIVE PACKET
SENT ALIVE PACKET
RECEIVED ALIVE PACKET
SENT ALIVE PACKET
RECEIVED ALIVE PACKET
SENT ALIVE PACKET
RECEIVED ALIVE PACKET
SENT ALIVE PACKET
SENT ALIVE PACKET
SENT ALIVE PACKET
RECEIVED ALIVE PACKET
RECEIVED ALIVE PACKET
SENT ALIVE PACKET
RECEIVED ALIVE PACKET
SENT ALIVE PACKET
RECEIVED ALIVE PACKET
SENT ALIVE PACKET
RECEIVED ALIVE PACKET
SENT ALIVE PACKET
SENT ALIVE PACKET
SENT ALIVE PACKET
SENT ALIVE PACKET
SENT ALIVE PACKET
SENT ALIVE PACKET
SENT ALIVE PACKET
SENT ALIVE PACKET
RECEIVED ALIVE PACKET RECEIVED ALIVE PACKET RECEIVED ALIVE
PACKET RECEIVED ALIVE PACKET RECEIVED ALIVE PACKET RECEIVED ALIVE
PACKET RECEIVED ALIVE PACKET RECEIVED ALIVE PACKET RECEIVED ALIVE
PACKET RECEIVED ALIVE PACKET ****RECEIVED TIMEOUT PACKET****

Connection Timeout.

编辑

这在我的另一台运行相同代码的电脑上从未发生过

编辑2


数据包的组合不是问题,但是数据包应该直接发送,而不是延迟。

KEEPALIVE
选项添加到我的套接字中似乎解决了这个问题


多亏了@cdarke。

您使用的是KEEPALIVE吗?您正在设置TCP_节点延迟吗?请参阅setsockopt()。在
send
/
receive
级别,TCP/IP可能存在的重复是一个流,而不是数据包协议。因此,在读取它时,会得到一个连续的字节流。在较低的层,它可以合并/拆分,但感觉像这样,您将阅读您发送的部分/多个“消息”。如果您有数据块,需要简化消息,则需要实现消息格式;长度前缀是最简单的前缀之一。@Z0q由于TCP/IP对您隐藏了所有数据包的详细信息,您无法接收“数据包”。当您调用
receive
时,无论缓冲区中有多少,它都会传递给您。这可能会导致发送的消息根据传输层进行拆分或加入。我还有一个问题:定期检查TCP连接是否仍然存在是否有意义?这种机制已经包含在TCP本身中,我不知道如何实现。在两个小时过去之前,它完全没有效果。您必须更改了其他内容。@EJP:2小时通常是默认值,但某些系统(如Linux)通过
setsockopt()
支持
TCP_-KEEPIDLE
TCP_-KEEPINTVL
TCP_-keepnt
套接字选项,允许每个套接字自定义
SO_-KEEPALIVE
使用的间隔。Windows没有这些选项,但它通过
WSAIoctl()
提供了
SIO\u KEEPALIVE\u VALS
。@RemyLebeau确实如此,但TCP KEEPALIVE机制中仍然没有任何东西可以解决这些延迟。我无法想象为什么会有人提出这个建议。当然,他已经禁用了Nagle算法,或者修复了硬件中的某些东西。我不确定我的应用程序出了什么问题。有时错误会再次出现,有时添加printf()可以解决问题,删除它会使问题再次出现。有时某些数据包不会被接收(大约100个数据包中有1个)。我想可能是内存泄漏或未初始化的变量?