【问题标题】:Are TCP sockets persistent?TCP 套接字是持久的吗?
【发布时间】:2017-11-13 02:14:14
【问题描述】:

我在 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 秒,更改该值似乎没有任何影响。

这是什么原因造成的,我该如何预防?

谢谢

【问题讨论】:

  • 这看起来像有一些数据包过滤器(防火墙或 NAT 路由器)在它们之间保持连接状态,并在一些不活动后删除连接状态。答案中建议的 SO_KEEPALIVE 应该有助于防止由于不活动而放弃状态。

标签: php sockets ssl tcp reactphp


【解决方案1】:

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

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

用法:

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

【讨论】:

  • 不,迈克尔,我没有,但会调查。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-01
  • 2014-02-07
  • 1970-01-01
  • 2017-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多