我启动并运行了一个TCP服务器,它同时支持许多客户端连接,以及读取和发送数据 . 但是,当客户端关闭连接时,服务器上会有一个延迟来检测断开连接的客户端 .
// TCP socket created here
$clients = array($socket);
while (true) {
$read = $clients; // Copy of $clients
$write = NULL;
$except = NULL;
$num_changed_sockets = socket_select($read, $write, $except, NULL);
if ($num_changed_sockets === false) {
// ...
} else if ($num_changed_sockets > 0) { // Something changed
printb("In here."); // EDIT
if (in_array($socket, $read)) { // For new connections and removing host from the $clients copy
$newsock = socket_accept($socket);
if ($newsock !== false) {
printb("Client $newsock connected");
$clients[] = $newsock;
}
$key = array_search($socket, $read);
unset($read[$key]);
}
foreach ($read as $read_socket) { // The actual problem starts here?
printb("Read part."); // EDIT
$data = socket_read($read_socket, 128);
if ($data === false) {
printb("Client $read_socket disconnected");
$key = array_search($read_socket, $clients);
socket_close($clients[$key]);
unset($clients[$key]);
continue;
}
}
}
编辑I:我刚刚在代码中添加了调试打印 . 当单个客户端断开连接时,服务器将从 $num_changed_sockets 进入无限循环 . 有办法解决吗?
编辑II: var_dump 在客户端断开连接后给出空字符串 .
编辑III:根据上次编辑,断开客户端,如果 socket_read 返回一个空字符串似乎工作 . 我在PHP的网站上找到了一条说明:
注意:当没有更多数据要读取时,socket_read()返回零长度字符串(“”) .
当客户端断开连接时,这不应该返回 false 吗?