Gibt es eine Möglichkeit, die Quelle UDP-Port mit PHP angeben?
Frage
Ich brauche eine Nachricht über UDP an ein Remote-Geräte zu senden. Ich weiß, dass wenn ich den gleichen UDP-Port verwenden, die sie verwendet, während Informationen an den Server sendet, um es zu schreiben, wieder die Nachrichten geht.
Ich bin derzeit mit:
$fp = fsockopen( $destination, $port, $errno, $errstr); if (!$fp) { echo "ERROR: $errno - $errstr\n"; } else { fwrite($fp, $m); fclose($fp); }
Aber so habe ich keine Kontrolle über welchen Port verwendet als Quellport werden wird.
In Java hat eine verwenden können:
client = new DatagramSocket(21000);
Gibt es eine Möglichkeit etwas ähnliches mit PHP zu tun.
Lösung
Sie können es tun, indem ein normales UDP-Sockets mit socket_create()
Erstellen und Verwenden von socket_bind()
es an einen bestimmten Port zu binden. Dann verwenden z.B. socket_sendto zur Angabe des Endpunkts und Portierung auf zu senden. Beispielcode folgt.
Ein einfacher Server, der die Portnummer und IP-Adresse des Clients mit socket_stream_server()
ausspuckt:
<?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);
?>
und der Client ist wie folgt:
<?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);
?>
Ausführen des Server (auf der Kommandozeile) gibt diese Ausgabe, wenn der Client mehrere Male ausgeführt wird:
<knuthaug@spider php>php server.php
127.0.0.1:50001
127.0.0.1:50001
127.0.0.1:50001
^C
<knuthaug@spider php>