【问题标题】:PHP Check whether Socket is still connectedPHP 检查 Socket 是否仍然连接
【发布时间】:2017-02-28 04:59:30
【问题描述】:

我正在尝试使用 PHP 中的套接字。我只有在 C#、Java 和 Basic 方面的经验。在 C# 和 Java 中有一个名为“Connected”或“isConnected”的函数,但在 PHP 中我找不到这样的函数来检查套接字是否仍然连接。 我读到我必须发送或接收要检查的数据,但是有没有办法在不发送或接收的情况下检查套接字的连接状态,因为检查必须在 if 子句中创建一个新的套接字将使用数组或旧数组。数据的发送和接收在另一个函数中。

一些有效的代码,但总是在数组中使用新条目...

$Worker = Array();

        while($this->Listener)
        {
            $accept = socket_accept($this->Listener);
            if($accept)
            {
                $jumpout = false;
                for($i = 0; $i < count($Worker); $i++)
                {
                    if(!$Worker[$i]) // check whether socket is connected or not
                    {
                        $Worker[$i] = $accept;
                        unset($accept);
                        $this->Logger->Write("New Client connected - " . $i);
                        $jumpout = true;
                    }
                }
                if(!$jumpout)
                {
                    $Worker[count($Worker)] = $accept;
                    unset($accept);
                    $this->Logger->Write("New Client connected - " . (count($Worker) + 1));
                }
            }
            socket_listen($this->Listener);
        }

如果不使用复杂的线程或其他一些复杂的东西,就不会给套接字任何事件或选项吗?

【问题讨论】:

  • 我相信套接字始终保持连接,除非在您端或远程端明确关闭。如果在远程端,在您尝试读取/写入您认为是打开的套接字之前,无法判断它是打开还是关闭。 socket_get_status() 不可靠
  • 为什么@Dave 不可靠?
  • 它是一个包装器 stream_get_meta_data() 都不能与 socket() 函数一起使用!并且它并不总是返回您期望它返回的内容,尤其是在使用非阻塞套接字时。有很多信息,包括您自己和 volkinc 提供的两个链接上的一些“解决方法”

标签: php sockets


【解决方案1】:

尝试使用 if else 的 socket_get_status。它应该返回套接字的状态。

要了解有关如何使用它的更多信息,请参阅以下示例:http://php.net/manual/en/function.socket-get-status.php

【讨论】:

  • 正如 Dave 在上面的 cmets 中所说,socket_get_status 仅适用于流套接字,它不适用于 socket_create 或 socket_accept 。检查这个:gist.github.com/mcuadros/9604673
猜你喜欢
  • 1970-01-01
  • 2015-08-27
  • 2016-05-21
  • 2015-04-02
  • 1970-01-01
  • 1970-01-01
  • 2018-06-10
  • 1970-01-01
  • 2012-10-14
相关资源
最近更新 更多