【发布时间】:2017-11-13 02:14:14
【问题描述】:
我在 Raspberry Pi3 上运行的 C++ 客户端和在 Centos7 上使用 Php7 运行的 ReactPHP 服务器之间遇到套接字中断。请参阅以下内容:
- 客户端使用 TLS over TCP 在端口 1337 上创建到服务器的套接字连接。
- 客户端能够将数据写入服务器。
- 服务器能够将数据写入客户端。
- Tshark 在两台机器上运行,过滤器仅针对端口 1337,并看到此初始通信。
- 接下来的一个小时内没有发生通信,两台机器上的 Tshark 都确认没有发生通信。
- 客户端或服务器均未收到关闭连接,并认为连接仍处于打开状态。
- 然后服务器尝试向客户端写入更多数据,Tshark 看到服务器线路上的传输,但 Tshark 没有看到客户端线路上的传输,显然客户端没有响应。
- 如果客户端守护程序随后关闭,服务器会感知到连接已关闭。
- 如果随后关闭服务器守护程序而不是客户端守护程序,则客户端不会感知到连接已关闭。
php.ini 显示 default_socket_timeout 为 60 秒,更改该值似乎没有任何影响。
这是什么原因造成的,我该如何预防?
谢谢
【问题讨论】:
-
这看起来像有一些数据包过滤器(防火墙或 NAT 路由器)在它们之间保持连接状态,并在一些不活动后删除连接状态。答案中建议的 SO_KEEPALIVE 应该有助于防止由于不活动而放弃状态。
标签: php sockets ssl tcp reactphp