PHP:发送一个UDP广播消息,然后等待响应


PHP : Send an UDP broadcast message , and wait the response

我使用此代码发送UDP广播消息

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

我想要一些特定的网络设备(在我的情况下是一些带有以太网屏蔽的Arduino板)响应特定的消息。

代码可以工作,但是这样我不能打印所有的响应,只能打印一个

您需要一个while循环,如果在超时时间内没有响应,则中断该循环。

第一次设置超时,如5秒:

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

和循环:

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

完整代码:

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