2015-08-07 37 views
10

Ho usato questo codice per inviare un messaggio di rete UDPPHP: Invia un messaggio di rete UDP, e attendere la risposta

$ip = "255.255.255.255"; 
$port = 8888; 
$str = "DEVICE_DISCOVERY"; 

$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); 
socket_set_option($sock, SOL_SOCKET, SO_BROADCAST, 1); 
socket_sendto($sock, $str, strlen($str), 0, $ip, $port); 

socket_recvfrom($sock, $buf, 20, 0, $ip, $port); 
echo "Messagge : < $buf > , $ip : $port <br>"; 

socket_close($sock); 

voglio che alcuni dispositivi di rete specifici (nel mio caso è alcuni Arduino schede con schermo ethernet) rispondono con un messaggio particolare.

Il codice funziona, ma in questo modo non riesco a stampare tutte le risposte ma solo una.

+0

Eh, così, si significa che si desidera utilizzare un ciclo continuo? – Epodax

+0

Certo, certo, ma in questo caso non so come usarlo – WhiteLine

+0

I tuoi dati di ritorno in un array? usa 'foreach() {}', scopri quale forma di dati è stata attivata la tua risposta e poi usa il ciclo appropriato. – Epodax

risposta

7

È necessario un ciclo while, da cui si interrompe se non c'è risposta entro il timeout.

primo timeout impostato, ad esempio 5 secondi:

socket_set_option($sock,SOL_SOCKET,SO_RCVTIMEO,array("sec"=>5,"usec"=>0)); 

e il ciclo:

while(true) { 
    $ret = @socket_recvfrom($sock, $buf, 20, 0, $ip, $port); 
    if($ret === false) break; 
    echo "Messagge : < $buf > , $ip : $port <br>"; 
} 

codice completo:

$ip = "255.255.255.255"; 
$port = 8888; 
$str = "DEVICE_DISCOVERY"; 

$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); 
socket_set_option($sock, SOL_SOCKET, SO_BROADCAST, 1); 
socket_set_option($sock, SOL_SOCKET, SO_RCVTIMEO, array("sec"=>5, "usec"=>0)); 
socket_sendto($sock, $str, strlen($str), 0, $ip, $port); 

while(true) { 
    $ret = @socket_recvfrom($sock, $buf, 20, 0, $ip, $port); 
    if($ret === false) break; 
    echo "Messagge : < $buf > , $ip : $port <br>"; 
} 

socket_close($sock); 
+0

Avevo già visto questa soluzione, andrebbe bene se potessi impostare queste opzioni: socket_set_option ($ sock, SOL_SOCKET, SO_BROADCAST, 1); – WhiteLine

+0

Puoi, 'SO_RCVTIMEO' è extra, non invece di 'SOL_SOCKET'. – Marek

+0

se faccio questo: 'socket_set_option ($ sock, SOL_SOCKET, SO_RCVTIMEO, array (" sec "=> 10," usec "=> 0));" il timeout funziona, ma non il messaggio broadcast, se faccio questo: 'socket_set_option ($ sock, SOL_SOCKET, SO_BROADCAST, array (" sec "=> 10," usec "=> 0));" niente funziona – WhiteLine