2009-07-01 7 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); 
     } 

しかし、このように私はポートが送信元ポートとして使用される予定されているのを制御することはできません。 Javaでは

は1つが使用することができます:

 
     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

関連する問題