这个套接字服务器工作正常,但不明白如果没有关闭连接,如何检查客户端是否仍然连接 如果没有如何关闭该连接,任何机构都可以帮助检查客户端是否仍然连接
感谢
<?php
// PHP SOCKET SERVER
// Configuration variables
$host = "127.0.0.1";
$port = 3000;
$max = 5000;
$client = array();
// No timeouts, flush content immediatly
@set_time_limit(0);
ob_implicit_flush();
// Server functions
// Create socket
$sock = @socket_create(AF_INET, SOCK_STREAM, 0) or die("[" . date('Y-m-d H:i:s') . "] Could not create socket\n");
// Bind to socket
socket_bind($sock, $host, $port) or die("[" . date('Y-m-d H:i:s') . "] Could not bind to socket\n");
// Start listening
socket_listen($sock) or die("[" . date('Y-m-d H:i:s') . "] Could not set up socket listener\n");
rLog("Server started at " . $host . ":" . $port);
// Server loop
while (true) {
socket_set_block($sock);
// Setup clients listen socket for reading
$read[0] = $sock;
for ($i = 0; $i < $max; $i++) {
if (@$client[$i]['sock'] != null)
$read[$i + 1] = $client[$i]['sock'];
}
// Set up a blocking call to socket_select()
$ready = socket_select($read, $write = null, $except = null, $tv_sec = null);
// If a new connection is being made add it to the clients array
if (in_array($sock, $read)) {
for ($i = 0; $i < $max; $i++) {
if (@$client[$i]['sock'] == null) {
if (($client[$i]['sock'] = socket_accept($sock)) < 0) {
rLog("socket_accept() failed: " . socket_strerror($client[$i]['sock']));
} else {
rLog("Client #" . $i . " connected");
}
break;
} elseif ($i == $max - 1) {
rLog("Too many clients");
}
}
if (--$ready <= 0)
continue;
}
for ($i = 0; $i < $max; $i++) {
if (in_array(@$client[$i]['sock'], $read)) {
$input = socket_read($client[$i]['sock'], 1024);
$n = trim($input);
if ($input) {
// Strip whitespaces and write back to user
// Respond to commands
/*$output = ereg_replace("[ \t\n\r]","",$input).chr(0);
socket_write($client[$i]['sock'],$output);*/
$processRe = processRequest($input);
sendMessage($client[$i]['sock'],$processRe);
}
} else {
//if($client[$i]['sock']!=null){
// Close the socket
//socket_close($client[$i]['sock']);
//unset($client[$i]);
//rLog("Disconnected(1) client #".$i);
//}
}
}
}
socket_close($sock);
?>
答案 0 :(得分:0)
当客户端关闭连接时,socket_select
funcion将返回,并且当您致电socket_read
时,socket_read
将为socket_close
提供指定的套接字句柄,您将获得 FALSE ,这意味着客户端关闭连接。
但是当客户端连接时,您可以通过在其客户端套接字句柄上调用{{1}}函数来关闭连接。