私は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から呼び出されます。
'socket_bind'をループバックからサーバーの外部IPアドレスに変更してみてください。 – ircmaxell
ありがとう、0.0.0.0へのバインディングもうまくいきました。 :) – Caesar