mikrocontroller.net

Forum: PC-Programmierung PHP Udp Broadcast empfangen und antworten


Autor: Günther (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich hatte die Frage bereits für C++ gestellt, nun das ganze nochmal für 
PHP.

Ich will einen UDP Broadcast verschicken und dann von jedem antwortenden 
Gerät die Antwort anzeigen.

Der Broadcast klappt bisher nur in einem angegebenen Netzwerk, z.b. 
192.168.9.255. Was ist aber, wenn ich mehrere Netzwerkadapter habe?

Zusätzlich empfange ich keine Antwort und es wird nichts ausgegeben. Ich 
habe schon etliche denkbare Möglichkeiten probiert.

Mit Wireshark kann ich sehen, dass (bei 192.168.9.255) der Broadcast 
verschickt wird und mein Gerät auch tatsächlich eine Antwort schickt!

Was mache ich bloß falsch?

Hier mein Code:
<?php
error_reporting(E_ALL | E_STRICT);

$server_ip = '192.168.9.255';
$server_ip2 = '192.168.9.26';
$server_port = 6000;
$beat_period = 5;
$message = 'HELLO DEVICE';
$recv = "";

$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
socket_set_option($socket, SOL_SOCKET, SO_BROADCAST, 1);
socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array("sec"=>5, "usec"=>0));
socket_connect($socket,$server_ip,$server_port);
socket_send($socket, $message, strlen($message), 0);
while(true) {
  $ret = @socket_recv($socket, $buf, 20, 0);
  if($ret === false) break;
  echo "Messagge : < $buf > , $ip : $port <br>";
}
socket_close($socket); 

//socket_bind($socket, $server_ip, $server_port);
//socket_send($socket, $message, strlen($message), 0);
//$x = socket_recv($socket, $recv, 10, 0);

?>

Danke!!

Günther

Autor: guest (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Günther schrieb:
> Was ist aber, wenn ich mehrere Netzwerkadapter habe?

Dann mußt Du halt von allen vorhandenen Netzwerkadaptern die 
IP-Addressen und Netzwerkmasken ermitteln, daraus dann die jeweiligen 
Broadcast-Addresen zusammenbauen und dann Deine UDP-Pakete da hin 
schicken.

Autor: Günther (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ließe sich irgendwie einrichten. Aber dennoch empfange ich keine UDP 
Antwort.

ich binde jetzt auf NULL und Port 6000. Ich empfange meinen eigenen 
Broadcast, aber nicht die ANtwort vom Gerät.
$server_ip = '0.0.0.0';
$server_ip2 = '192.168.9.255';
$server_port = 6000;
$beat_period = 5;
$message = 'HELLO DEVICE';
$recv = "";

$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
socket_set_option($socket, SOL_SOCKET, SO_BROADCAST, 1);
socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array("sec"=>5, "usec"=>0));
socket_bind($socket,NULL,$server_port);
socket_sendto($socket, $message, strlen($message), 0,$server_ip2, $server_port);
echo socket_strerror(socket_last_error($socket));
sleep(1);
while(true) {
  $ret = socket_recv($socket, $buf, 40, 0);
  if($ret === false) break;
  echo "Messagge : < $buf > , $ret :  <br>";
}
socket_close($socket); 

Autor: Albert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, Lösung entdeckt. Ich muss lediglich dafür sorgen, dass ich genügend 
Zeichen empfangen will. Nur dann wird das ganze UDP Telegramm geladen.

Also z.b.
$ret = socket_recv($socket, $buf, 1000, 0);

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.