【发布时间】:2018-07-09 15:30:57
【问题描述】:
我每 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.
编辑
这在我的另一台运行相同代码的 PC 上从未发生过。
编辑 2
数据包的合并没有问题,但是数据包应该直接发送而不是延迟。
【问题讨论】:
-
你在使用 KEEPALIVE 吗?你在设置 TCP_NODELAY 吗?请参阅 setsockopt()。
-
send/receive级别的 TCP/IP 是流而不是数据包协议。所以你在读取它时会得到一个连续的字节流。在较低层,它可以合并/拆分,但感觉就像你会阅读你发送的部分/多个“消息”。如果您有数据块,则可以简化消息,您需要实现消息格式;长度前缀是最简单的前缀之一。 -
@Z0q 由于 TCP/IP 对您隐藏了所有数据包详细信息,因此您无法接收“数据包”。当您调用
receive时,无论缓冲区中有多少,它都会传递给您。这可能会导致发送的消息根据传输层进行拆分或合并。 -
我还有一个问题:定期检查 TCP 连接是否仍然存在真的有意义吗?这种机制已经包含在 TCP 本身中。
标签: c++ c sockets networking tcp