PHP:接收UDP广播

PHP: receive UDP broadcast

目前我正在尝试使用 PHP 接收 UDP 广播。这个话题在互联网上很难找到,如果没有真正的解决方案会让我成功。 这是我当前的代码,我如何设置我的服务器套接字来接收 UDP 广播:

        $context = stream_context_create([
            'socket' => [
                \SO_BROADCAST => 1,
                'so_broadcast' => 1,
            ],
        ]);
        $socket = @\stream_socket_server($address, $errno, $errstr, \STREAM_SERVER_BIND, $context);

因为我不确定我是否必须使用常量 \SO_BROADCAST 或字符串 'so_broadcast' 我在这个例子中列出了这两个。当然,我已经尝试过各种不同的方法。这里的文档实际上很清楚:https://www.php.net/manual/en/context.socket.php#context.socket.so_broadcast 我仍然收不到广播。我目前正在通过 NC 进行测试:

$ echo 'HELLO' | nc -u -v -b 10.88.0.255 20000

通过tcpdump我也可以在服务器接口上看到广播,但不幸的是它没有到​​达我的套接字?如果我直接向服务器 ip 发送一个数据包,它就会到达,我可以处理它。

还有其他人对我有想法吗?

问候,沃尔克。

编辑:

一个简单的上下文参数反向检查显示:

var_dump(stream_context_get_options($context));
# array(1) {
#  ["socket"]=>
#  array(1) {
#    ["so_broadcast"]=>
#    int(1)
#  }
#}

所以我认为 string 的选择是正确的决定...

答案很简单,检查防火墙设置。这是我的问题,我的本地防火墙阻止广播到 255.255.255.255。

这是在专用接口上接收 DHCP 广播数据包的完整示例代码 ep1:

<?php
$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);

socket_set_option($socket, SOL_SOCKET, SO_BINDTODEVICE, 'ep1');
socket_set_option($socket, SOL_SOCKET, SO_BROADCAST, 1);
socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);
socket_set_option($socket, SOL_SOCKET, SO_REUSEPORT, 1);

socket_bind($socket, '255.255.255.255', 67);
while (1) {
    if ($src = @socket_recv($socket, $data, 9999, 0)) {
        echo $data . PHP_EOL;
    }
}