TCP套接字是否持久存在?

时间:2017-06-11 15:03:11

标签: php sockets ssl tcp reactphp

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

  1. 客户端使用端口1337上的TLS over TCP创建到服务器的套接字连接。
  2. 客户端可以将数据写入服务器。
  3. 服务器能够将数据写入客户端。
  4. Tshark正在这两台机器上运行,只有1337端口的过滤器,并且看到了这个初始通信。
  5. 下一个小时没有通讯,两台机器上的Tshark确认没有通讯。
  6. 客户端或服务器均未收到紧密连接,并认为连接仍处于打开状态。
  7. 服务器然后尝试向客户端写入更多数据,Tshark看到服务器线路上的传输,但Tshark没有看到客户端线路上的传输,显然客户端没有响应
  8. 如果客户端守护程序随后关闭,则服务器会检测到连接已关闭。
  9. 如果服务器守护程序然后关闭而不是客户端守护程序,则客户端不会感觉到连接已关闭。
  10. php.ini将default_socket_timeout显示为60秒,更改该值似乎没有任何影响。

    导致这种情况的原因是什么?如何预防?

    谢谢

1 个答案:

答案 0 :(得分:0)

您是否尝试在客户端套接字上设置SO_KEEPALIVE选项?

以下是有关其工作原理的一些详细信息,以及为什么您的连接只能在一方过期。 http://tldp.org/HOWTO/TCP-Keepalive-HOWTO/overview.html

用法:

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