TCP套接字是持久性的吗?

3
我在 Raspberry Pi3 上运行的 C++ 客户端和在 Centos7 上使用 Php7 的 ReactPHP 服务器之间的 socket 连接存在故障。请参考以下内容:
  1. 客户端使用 TLS over TCP 在端口 1337 上创建了一个套接字连接到服务器。
  2. 客户端可以向服务器写入数据。
  3. 服务器可以向客户端写入数据。
  4. 两台机器上都运行着 Tshark,过滤器仅针对端口 1337,并且看到了这种初始通信。
  5. 接下来一个小时没有任何通信,两台机器上的 Tshark 确认没有通信发生。
  6. 客户端或服务器都没有收到关闭连接的消息,并且认为连接仍然处于打开状态。
  7. 然后服务器尝试向客户端写入更多数据,Tshark 在服务器上看到了传输,但是 Tshark 没有在客户端上看到传输,客户端也不会响应。
  8. 如果然后关闭客户端守护进程,服务器会感知到连接已关闭。
  9. 如果相反地关闭服务器守护进程而不是客户端守护进程,则客户端不会感知连接已关闭。

php.ini 显示 default_socket_timeout 为 60 秒,更改该值似乎没有任何影响。

这是什么原因,并且如何预防它?

谢谢


这似乎是中间有一些数据包过滤器(防火墙或NAT路由器),它保持连接状态并将在一段时间内的不活动后删除连接状态。像答案中建议的SO_KEEPALIVE应该有助于防止因不活动而丢失状态。 - Steffen Ullrich
1个回答

0

你尝试过在客户端套接字上设置SO_KEEPALIVE选项吗?

以下是一些关于它如何工作以及为什么你的连接可能只在一侧过期的细节。 http://tldp.org/HOWTO/TCP-Keepalive-HOWTO/overview.html

用法:

char val = 1;    
setsockopt(my_socket, SOL_SOCKET, SO_KEEPALIVE, &val, 1);

不,Michael,我还没有,但我会调查一下。谢谢。 - user1032531

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接