我有一个 php 服务器正在监听 1 个 c# 客户端。
当连接建立后,它会一直保持活动状态,直到客户端发送“退出”命令来终止 PHP 服务器。
但是,当 C# 客户端在没有“退出”命令(即:单击 Windows 窗体中的关闭 (x) 按钮)的情况下断开连接时,服务器只会继续侦听,并且无法从该客户端接收任何其他连接。
有没有办法从服务器端(PHP)检查与客户端的连接是否仍然有效?
我的 php 服务器代码基于以下示例1:http://php.net/manual/en/sockets.examples.php http://php.net/manual/en/sockets.examples.php
如果有人有兴趣重现错误/错误行为,请粘贴 example1 中的代码:http://php.net/manual/en/sockets.examples.php http://php.net/manual/en/sockets.examples.php,从 LAN 中的远程客户端通过 telnet 连接,拔下客户端线路... php 服务器将永远挂起,不接受新连接。
在循环中,您需要检查返回值socket_read() http://php.net/manual/function.socket-read.php。如果返回 FALSE,则存在读取错误(这可能是由远程主机关闭连接引起的)。您提供的链接中的示例代码涵盖了这种情况。
如果您需要优雅地处理某些错误状态,您始终可以使用以下命令检查套接字错误代码socket_last_error() http://php.net/manual/function.socket-last-error.php -- 这张纸条 http://php.net/manual/en/function.socket-last-error.php#95160描述可能的代码。
Edit:
当使用 putty 进行 telnet 时,如果我用 X 按钮关闭,则 PHP 中的连接会正确关闭,但如果我拔掉 putty 机器的以太网线,PHP 服务器就会挂起。
杀死 PuTTY 时连接被关闭的原因是 PuTTY 在退出时关闭其打开的连接。这导致socket_read()
返回错误代码(我相信ECONNRESET
)。如果你拔掉网线,它就没有机会这样做。
TCP 连接取决于您的网络配置方式should最终失败。您可以尝试通过设置来控制超时SO_RCVTIMEO https://www.php.net/manual/function.socket-get-option.php with socket_set_option() https://www.php.net/manual/function.socket-set-option.php,但这并不总是适用于所有平台(我在看着你,WinSock).
或者,您可以使用以下方式滚动自己的轮询循环socket_select() http://php.net/manual/function.socket-select.php有合理的超时时间。如果超时后所有连接的套接字都没有数据要发送,则终止服务器。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)