2011-02-08 15 views
1

私はphp udpクライアントを作成しようとしています。 ?私はサイクルでそれを呼び出した場合php udpはループバックでのみ動作します

//Parsing values 
error_reporting(E_ALL | E_STRICT); 
ini_set("display_errors","1"); 

$cycles = $_GET['cycles']; 
$cycles = $cycles > 600 ? 600 : $cycles; 
if(!isset($_GET['lport']) || $_GET['lport'] < 1500 || $_GET['lport'] > 65534) { 
    $rport = 11115; 
} else { 
    $rport = $_GET['lport']; 
} 
if(!isset($_GET['sport']) || $_GET['sport'] < 1500 || $_GET['sport'] > 65534) { 
    $port = 11115; 
} else { 
    $port = $_GET['sport']; 
} 
$from = isset($_GET['ip']) ? $_GET['ip'] : '127.0.0.1'; 

//Relevant code starts here 
$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); 
socket_bind($socket, '127.0.0.1', $rport); 
socket_set_nonblock($socket); 

while($cycles--) { 
    $msg = "PING! " . $cycles; 
    echo socket_sendto($socket, $msg, strlen($msg), 0, $from, $port) ? "sendto success<br>" : "sendto fail<br>"; 
    socket_recvfrom($socket, $buf, 1000, 0, $from, $port); //0x40 is MSG_DONTWAIT 
    echo "$from:$port - $buf<br>" . PHP_EOL; 
    sleep(1); 
} 

socket_close($socket); 

= 10 & IP = [外部IP]が、それは動作しません、それは続けて印刷:

警告:socket_sendto()[function.socket -sendto]:できない ソケットに書き込む[22]線に /var/www/default/Tests/UdpTest.php に無効な引数
のsendto socket_recvfrom()[function.socket-のrecvfrom]:[11]のrecvfromする できない: におけるリソース が一時的に利用できない/var/www/default/Tests/UdpTest.php には

警告フェイルライン
62.180.108.236:11116 -

私はそれが送信したものを受け、期待どおりに動作します?cylces=10&ip=127.0.0.1を使用している場合。 2つの異なるポートを使い、そのマシンでnetcatを実行しようとすると同じです。外部IPはそのマシンの物理アドレスであり、スクリプトはapache、btwから呼び出されます。

+1

'socket_bind'をループバックからサーバーの外部IPアドレスに変更してみてください。 – ircmaxell

+0

ありがとう、0.0.0.0へのバインディングもうまくいきました。 :) – Caesar

答えて

3

問題は、バインドするインターフェイスです。

ループバックへのバインド(127.0.0.1)は、そのネットワークインターフェイス上のデバイスとしか通信できないことを意味します。また、ローカルマシンがそのインターフェイス上の唯一のデバイスであるため、別のネットワーク上のアドレスを指定すると、sendto()recvfrom()は失敗します。

問題を解決するには、すべてのインターフェイス(0.0.0.0)またはサーバーの特定の外部IPアドレスにバインドします。これにより、IPが接続されているネットワーク上の任意のマシンと通信することができます。

関連する問題