2012-07-18 86 views
1

我有以下代碼的php cli套接字服務器;客戶端連接,併發送請求指定連接到PHP CLI套接字服務器的客戶端的遠程IP地址

<?php 
// PHP SOCKET SERVER 
error_reporting(E_ERROR); 
// Configuration variables 
$host = "127.0.0.1"; 
$port = 5600; 
$max = 500; 
$client = array(); 

// No timeouts, flush content immediatly 
set_time_limit(0); 
ob_implicit_flush(); 

// Server functions 
function rLog($msg){ 
      $msg = "[".date('Y-m-d H:i:s')."] ".$msg; 
      echo($msg."\n"); 

} 
// 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); 

             if($input){ 

                rLog("Client ".$i." Call:".$input.")"); 

                ## <<<<<<<<<<< Clients Request Show Here >>>>>>>>>>>> ## 
                ## <<<<<<<<<<< Clients Request Show Here >>>>>>>>>>>> ## 
                ## <<<<<<<<<<< Clients Request Show Here >>>>>>>>>>>> ## 
                ## <<<<<<<<<<< Clients Request Show Here >>>>>>>>>>>> ## 
                ## <<<<<<<<<<< Clients Request Show Here >>>>>>>>>>>> ## 

             } 
          } 
      } 
} 
// Close the master sockets 
socket_close($sock); 
?> 

問:
- 如何檢測連接到我的PHP CLI插槽服務器的客戶端的IP地址?

+0

請注意,您的代碼不能處理併發連接。如果你想要的話,你必須使用支持線程的東西。即Node.js等 – Ron 2012-07-18 13:33:11

+0

@Ron它*可以在PHP中完成,但是你不應該這樣做,因爲它是一個完整的PITA,並且在單進程,單線程環境中不能很好地工作。但是也需要注意的是,Node.js確實不支持線程。因爲它是基於Javascript的,所有事情都是在單一進程中用一個線程執行的(嘿,我聽到你說,不是PHP那樣的?等待它...),它只是*顯示*因爲Javascript調度程序的工作方式。但是,您可以通過創建WebWorkers來產生新的進程 - 但這些仍然是單線程的。 – DaveRandom 2012-07-18 13:43:28

+0

@Ron值得進一步閱讀[這裏](http://ejohn.org/blog/how-javascript-timers-work/)。我感覺這張圖總結得非常好。但是,我不會期望[John Resig](http://stackoverflow.com/users/6524/john-resig)有任何其他內容。 – DaveRandom 2012-07-18 13:45:44

回答

1

行了,你成功地調用socket_accept(),把調用socket_getpeername()後立即:

if (($client[$i]['sock'] = socket_accept($sock)) < 0) { 
    rLog("socket_accept() failed: ".socket_strerror($client[$i]['sock'])); 
} else { 
    rLog("Client #".$i." connected"); 
    socket_getpeername($client[$i]['sock'], $address, $port); 
} 

$address現在包含遠程主機的IP地址,並$port包含遠程端口。你會這樣做的信息。

相關問題