2012-07-18 2 views
1

У меня есть сервер сокета php cli с кодом ниже; клиенты подключаются и посылают запросыУкажите удаленный IP-адрес клиентов, подключенных к серверу Socket PHP CLI

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

Вопрос:
- Как я могу обнаружить IP-адрес клиента, подключенный к моему PHP серверу кли сокета?

+0

Обратите внимание, что ваш код не может обрабатывать одновременные соединения. Если вы этого хотите, вы должны использовать что-то, что поддерживает потоки. То есть node.js и т. д. – Ron

+0

@Ron It * может быть сделано в PHP, но вы правы в том, что не должны, потому что это полный PITA и не очень хорошо работает в унифицированной одноуниверситетной среде , Однако также важно отметить, что Node.js делает * not * фактически поддерживающим потоки. Поскольку он основан на Javascript, все выполняется в одном процессе с помощью одного потока (Эй, я слышал, вы говорите, что это не PHP?) Подождите, он просто * появляется * для потоковой передачи из-за как работает планировщик Javascript. Однако вы можете создавать новые процессы, создавая WebWorkers, но они все еще однопоточны. – DaveRandom

+0

@Ron Стоит дальнейшее чтение [здесь] (http://ejohn.org/blog/how-javascript-timers-work/). Я считаю, что диаграмма очень хороша. Но тогда я не ожидал ничего от [John Resig] (http://stackoverflow.com/users/6524/john-resig). – DaveRandom

ответ

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 содержит удаленный порт. Делайте с этой информацией так, как вы.