2015-08-07 15 views
10

tôi đã sử dụng mã này để gửi một thông báo phát sóng UDPPHP: Gửi tin nhắn phát sóng UDP, và chờ đợi phản ứng

$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); 

Tôi muốn rằng một số thiết bị mạng nào đó (trong trường hợp của tôi là một số Arduino bảng với lá chắn ethernet) đáp ứng với một thông điệp cụ thể.

Mã hoạt động, nhưng theo cách này, tôi không thể in tất cả các câu trả lời mà chỉ in một câu trả lời.

+0

Eh, vì vậy, bạn có nghĩa là bạn muốn sử dụng một vòng lặp? – Epodax

+0

Chắc chắn tất nhiên, nhưng trong trường hợp này tôi không biết cách sử dụng nó – WhiteLine

+0

Dữ liệu trả về của bạn có trong một mảng không? sử dụng 'foreach() {}', tìm ra dạng dữ liệu mà phản hồi của bạn được bật và sau đó sử dụng vòng lặp thích hợp. – Epodax

Trả lời

7

Bạn cần một vòng lặp while, từ đó bạn ngắt nếu không có phản hồi trong thời gian chờ.

Đầu tiên thiết lập thời gian chờ, ví dụ 5 giây:

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

Và vòng lặp:

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

Full mã:

$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

Tôi đã nhìn thấy giải pháp này, sẽ là tốt nếu tôi có thể thiết lập các tùy chọn này: socket_set_option ($ sock, SOL_SOCKET, SO_BROADCAST, 1); – WhiteLine

+0

Bạn có thể, 'SO_RCVTIMEO' là phụ, không thay vì' SOL_SOCKET'. – Marek

+0

nếu tôi làm điều này: 'socket_set_option ($ sock, SOL_SOCKET, SO_RCVTIMEO, mảng (" sec "=> 10," usec "=> 0));' timeout hoạt động, nhưng không phải là tin nhắn quảng bá, nếu tôi làm điều này: 'socket_set_option ($ sock, SOL_SOCKET, SO_BROADCAST, mảng (" giây "=> 10," usec "=> 0));' không có gì hoạt động – WhiteLine

Các vấn đề liên quan