2012-07-18 2 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

+0

@Ron It *은 PHP로 처리 될 수 있지만 완전한 PITA이고 단일 프로세스, 단일 스레드 환경에서 잘 작동하지 않기 때문에 사용자가해서는 안되는 점에 있습니다. . 그러나 Node.js가 실제로 스레딩을 지원하지 않는다는 점도 중요합니다. Javascript 기반이기 때문에 모든 것이 단일 스레드로 단일 프로세스에서 실행됩니다. (안녕하세요, PHP라고하지 않습니까? 기다리십시오 ...), 간단히 * 때문에 스레드로 표시됩니다. Javascript 스케줄러가 작동하는 방식. 그러나 WebWorkers를 작성하여 새로운 프로세스를 생성 할 수는 있지만 여전히 단일 스레드입니다. – DaveRandom

+0

@Ron 가치가있는 [여기] (http://ejohn.org/blog/how-javascript-timers-work/). 이 도표는 그것을 아주 잘 요약 한 것 같습니다. 하지만 그때 나는 [존 Resig] (http://stackoverflow.com/users/6524/john-resig)에서 다른 것을 기대하지 않을 것이다. – DaveRandom

답변

1

즉시 성공적 socket_getpeername()에 전화를 넣어 socket_accept()를 호출 줄 끝

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 원격 포트가 포함되어 있습니다. 당신이 그 정보로하십시오.

관련 문제