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.

War es hilfreich?

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>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top