【发布时间】: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 提供的两个链接上的一些“解决方法”