[英]php socket server check client is connected or not
這個套接字服務器工作正常,但不明白如何檢查客戶端是否仍然連接,如果沒有關閉連接,任何機構都可以幫助檢查客戶端是否仍然連接,如果沒有如何關閉該連接
謝謝
<?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);
?>
當客戶端關閉連接時,將返回socket_select
函數,並且當您調用socket_read
時, socket_read
可以使用指定的客戶端套接字句柄,您將獲得FALSE ,這意味着客戶端關閉連接。
但是當客戶端連接時,您可以通過在他的客戶端套接字句柄上socket_close
function 來關閉連接。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.