2009-07-01 3 views
0

UDP를 통해 원격 장비에 메시지를 보내야합니다. 나는 서버에 정보를 보내는 동안 사용했던 것과 동일한 UDP 포트를 사용하면 메시지가 다시 쓰여진다는 것을 안다.PHP를 사용하여 소스 UDP 포트를 지정하는 방법이 있습니까?

 
     $fp = fsockopen($destination, $port, $errno, $errstr); 
     if (!$fp) { 
      echo "ERROR: $errno - $errstr\n"; 
     } else { 
      fwrite($fp, $m); 
      fclose($fp); 
     } 

을하지만이 방법으로 나는 포트가 소스 포트로 사용될 것입니다있는 제어 할 수 없습니다 :

내가 현재 사용하고 있습니다. 자바에서

하나를 사용할 수 있습니다

 
     client = new DatagramSocket(21000); 

PHP를 사용하여 비슷한 일을 할 수있는 방법이 있나요.

답변

1

일반적인 udp 소켓을 socket_create()으로 만들고 socket_bind()을 사용하여 특정 포트에 바인딩 할 수 있습니다. 그런 다음 그것을 전송할 엔드 포인트와 포트를 지정하는 socket_sendto. 예제 코드는 다음과 같습니다. socket_stream_server()를 사용하여 클라이언트의 포트 번호와 IP 주소를 뱉어

간단한 서버 :

<?php 

set_time_limit (20); 

$socket = stream_socket_server("udp://127.0.0.1:50000", 
           $errno, $errstr, 
           STREAM_SERVER_BIND); 
if (!$socket) { 
    die("$errstr ($errno)"); 
} 

do { 
    $packet = stream_socket_recvfrom($socket, 1, 0, $peer); 
    echo "$peer\n"; 
    stream_socket_sendto($socket, date("D M j H:i:s Y\r\n"), 0, $peer); 
} while ($packet !== false); 

?> 

클라이언트는 다음과 같이이다 :

<?php 

$address = '127.0.0.1'; 
$port = 50001; 
$dest_address = '127.0.0.1'; 
$dest_port = 50000; 

$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); 

if (socket_bind($sock, $address, $port) === false) { 
    echo "socket_bind() failed:" . socket_strerror(socket_last_error($sock)) . "\n"; 
} 

$msg = "Ping !"; 
socket_sendto($sock, $msg, strlen($msg), 0, $dest_address, $dest_port); 
socket_close($sock); 

?> 

명령 행에서 서버를 (실행)는 클라이언트를 여러 번 실행하면이 출력을 제공합니다.

<[email protected] php>php server.php 
127.0.0.1:50001 
127.0.0.1:50001 
127.0.0.1:50001 
^C 
<[email protected] php> 
+0

이 공동 Windows의 경우 소켓에 대한 지원이 필요하다는 것을 명심해야합니다.

 if (!extension_loaded('sockets')) { $prefix = (PHP_SHLIB_SUFFIX === 'dll') ? 'php_' : ''; dl($prefix . 'sockets.' . PHP_SHLIB_SUFFIX); } 
Sebas

관련 문제