2012-07-24 2 views
0
코드 아래

PHP CLI TCP 서버 소켓입니다,하지만 난 그것을 만들 수있는 방법을 모르는하거나 UDP 서버하지만 TCP & UDP 소켓 서버를 만들려고PHP CLI의 UDP 서버 소켓

MyCodes :

코드 위
// PHP SOCKET SERVER 
error_reporting(E_ERROR); 
// Configuration variables 
$host = "192.168.0.1"; 
$port = 5009; 
$max = 20; 

// MySQL Database Conf 
$db_host ='localhost'; 
$db_user ='root'; 
$db_pass ='5222348'; 
$db_database ='gps'; 

mysql_connect("$db_host", "$db_user", "$db_pass")or die("################# Can't connet to mysql server"); 
mysql_select_db("$db_database")or die("################# Can't connet to database"); 

// -------------------------------- 
$client = array(); 

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

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

} 
// Create socket 
// $sock = socket_create(AF_INET,SOCK_DGRAM,0) or die("[".date('Y-m-d H:i:s')."] Could not create socket\n"); UDP communication 
$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."\nrev:23-7-11:13"); 
// 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{ 
                   socket_getpeername($client[$i]['sock'], $address, $port); 
                   rLog("Client #".$i." connected from : ".$address.":".$port.""); 
                } 
                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==null){ 
                unset($client[$i]); 
             } 
             $n = trim($input); 
             $com = split(" ",$n); 
             if($n=="EXIT"){ 
                if($client[$i]['sock']!=null){ 
                   // Disconnect requested 
                   socket_close($client[$i]['sock']); 
                   unset($client[$i]['sock']); 
                   rLog("Disconnected(2) client #".$i); 
                   for($p=0;$p<count($client);$p++){ 
                       socket_write($client[$p]['sock'],"DISC ".$i.chr(0)); 
                   } 
                   if($i == $adm){ 
                       $adm = -1; 
                   } 
                } 
             }elseif($n=="TERM"){ 
                // Server termination requested 
                socket_close($sock); 
                rLog("Terminated server (requested by client #".$i.")"); 
                exit(); 
             }elseif($input){ 


                // ----------------------------------------- // 
                // $handle = fopen('inbox.txt', 'a+'); 
                // fwrite($handle, 
                 // $input."\n". 
                 // "------------------------------------------------------------\n"); 
                // ########################################################################################### // 
                // $input = "$POS,115316,160137.000,A,2719.9343,N,05310.5553,E,0.00,,180712,,,A/00000,00000/0,0,0,0/794"; // Sample Data 
                $input_first = explode(",", $input); 

                $frstvalue=$input_first[0]; // $POS   - Command 

                echo $input; 
                  $handle = fopen('force.log', 'a+'); 
                  fwrite($handle, 
                   "Time:[".date('Y-m-d H:i:s')."] , from : ".$address.":".$port."\ninput: ".$input."\n". 
                   "-------------------------------------------------------------------------------------\n"); 
                ########################### 
             } 
          }else{ 

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

완벽 TCP 연결에서 작동하지만, UDP 요청을 드릴 수 없습니다 s.

답변

0

UDP는 데이터 그램 전송되고, TCP에서 약간 다릅니다 : socket_listen

  • 제거 전화, 그것은 UDP에 적용 할 수 없습니다.
  • socket_accept (으)로 전화를 제거하십시오.
  • socket_recvfrom을 사용하면 $sock의 루프에서 데이터 그램을 수신 할 수 있습니다.

즉 원래 $sock이 데이터 소켓입니다. 즉, 여기에 하나만 있으면됩니다.

PHP는 "udp://..." URL과 함께 사용할 수있는 stream_socket_server 인터페이스도 제공합니다.

+0

고맙습니다.하지만이 설정을 변경하는 데 문제가 있다고 생각합니다. 첫 번째 원본 원본 코드의 변경 사항을 위에 설정할 수 있습니까? ;) – Root125

+0

나는 당신이 무슨 뜻인지 정말로 모르겠다. 내가 코드를 편집하기를 원한다면, 그렇게하지 않을 것입니다. –

+0

사용하지만 오류가 발생합니다 : -? , udp로부터의 Send 입력은 서버에 echo되지 않습니다. – Root125