【问题标题】:Remote socket disconnection not seen by PHPPHP 看不到远程套接字断开连接
【发布时间】:2012-12-17 03:07:54
【问题描述】:

我有一个监听多个套接字的 PHP 套接字服务器。
在我的客户端上,如果我暂停机器,则不会向 PHP 服务器发送断开连接消息。如何确定哪个客户端仍处于连接状态,或获取这些断开连接事件?
在 PHP 中,我使用 socket_select 来监听我所有的套接字。

谢谢!

【问题讨论】:

  • 如果机器突然停止,需要一段时间才能断开连接;当它确实发生时,它应该发出套接字准备好读取的信号,当你读取它时,读取的字节数为零。
  • “暂停机器”是什么意思? @Jack 如果“机器突然停止”,它要么发送一个 FIN,即 立即 被视为读取的零字节,或者它发送一个 RST,它立即被视为“对等方重置连接”,或者它什么也不发送,这被视为“一段时间”后的读取超时。
  • “如果'一台机器突然停止'它要么发送一个 FIN ...” - 让我停下来,你听不觉得奇怪吗? :) @EJP
  • 也许这个链接:stackoverflow.com/questions/9085615/…可以帮助你

标签: php sockets network-programming disconnect


【解决方案1】:

如果远程套接字正确关闭,那么您的套接字将变得可读,但接收调用将不返回任何数据。如果通信出现错误,下一次接收或发送操作将返回错误。

但是,如果连接只是空闲,那么您将不知道另一端是否处于活动状态。您可以设置一个套接字选项 (SO_KEEPALIVE) 以自动让系统发送“keep-alive”消息并发现是否有任何问题。 SO_KEEPALIVE 的问题在于默认时间是两个小时。如果您需要更短的时间(您很可能会这样做),那么最好的办法就是将您自己的保持活动消息作为协议的一部分实现。

【讨论】:

    【解决方案2】:

    socket_read 如果出现错误将返回 false,如果没有数据则返回空字符串。 这些东西不会触发事件,你必须测试连接是否仍然存在。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-05
      • 1970-01-01
      • 2012-02-23
      • 1970-01-01
      • 2019-06-07
      • 2014-11-21
      相关资源
      最近更新 更多