2011-06-07 188 views
1

这个套接字服务器工作正常,但不知道如何检查客户端是否仍然连接,如果没有关闭连接 任何机构可以帮助检查客户端是否仍然连接,如果没有如何关闭该连接php套接字服务器检查客户端是否连接

感谢

<?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

当客户端紧密结合,然后socket_select funcion将返回和指定的套接字句柄的客户,当你调用socket_read你会得到将可用于socket_readFALSE,这意味着客户端关闭连接。

但是,当客户端连接时,您可以通过在其客户端套接字句柄上调用socket_close函数来关闭连接。