3

我在 Raspberry Pi3 上运行的 c++ 客户端和在 Centos7 上使用 Php7 运行的 ReactPHP 服务器之间遇到套接字中断。请参阅以下内容:

  1. 客户端使用 TLS over TCP 在端口 1337 上创建到服务器的套接字连接。
  2. 客户端能够将数据写入服务器。
  3. 服务器能够将数据写入客户端。
  4. Tshark 在两台机器上都运行,过滤器只针对端口 1337,并看到了这个初始通信。
  5. 在接下来的一个小时内没有发生通信,两台机器上的 Tshark 都确认没有发生通信。
  6. 客户端或服务器都没有收到关闭的连接,并认为连接仍然打开。
  7. 然后服务器尝试向客户端写入更多数据,Tshark 看到服务器线路上的传输,但 Tshark 没有看到客户端线路上的传输,显然客户端没有响应。
  8. 如果客户端守护程序随后关闭,则服务器会感知到连接已关闭。
  9. 如果随后关闭服务器守护程序而不是客户端守护程序,则客户端不会感知到连接已关闭。

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

是什么导致了这种情况,我该如何预防?

谢谢

4

1 回答 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);
于 2017-06-11T15:12:51.317 回答