Forum: PC-Programmierung PHP Udp Broadcast empfangen und antworten


von Günther (Gast)


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:
1
<?php
2
error_reporting(E_ALL | E_STRICT);
3
4
$server_ip = '192.168.9.255';
5
$server_ip2 = '192.168.9.26';
6
$server_port = 6000;
7
$beat_period = 5;
8
$message = 'HELLO DEVICE';
9
$recv = "";
10
11
$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
12
socket_set_option($socket, SOL_SOCKET, SO_BROADCAST, 1);
13
socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array("sec"=>5, "usec"=>0));
14
socket_connect($socket,$server_ip,$server_port);
15
socket_send($socket, $message, strlen($message), 0);
16
while(true) {
17
  $ret = @socket_recv($socket, $buf, 20, 0);
18
  if($ret === false) break;
19
  echo "Messagge : < $buf > , $ip : $port <br>";
20
}
21
socket_close($socket); 
22
23
//socket_bind($socket, $server_ip, $server_port);
24
//socket_send($socket, $message, strlen($message), 0);
25
//$x = socket_recv($socket, $recv, 10, 0);
26
27
?>

Danke!!

Günther

von guest (Gast)


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.

von Günther (Gast)


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.
1
$server_ip = '0.0.0.0';
2
$server_ip2 = '192.168.9.255';
3
$server_port = 6000;
4
$beat_period = 5;
5
$message = 'HELLO DEVICE';
6
$recv = "";
7
8
$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
9
socket_set_option($socket, SOL_SOCKET, SO_BROADCAST, 1);
10
socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array("sec"=>5, "usec"=>0));
11
socket_bind($socket,NULL,$server_port);
12
socket_sendto($socket, $message, strlen($message), 0,$server_ip2, $server_port);
13
echo socket_strerror(socket_last_error($socket));
14
sleep(1);
15
while(true) {
16
  $ret = socket_recv($socket, $buf, 40, 0);
17
  if($ret === false) break;
18
  echo "Messagge : < $buf > , $ret :  <br>";
19
}
20
socket_close($socket);

von Albert (Gast)


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.
1
$ret = socket_recv($socket, $buf, 1000, 0);

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.