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;
}
}
目前我正在尝试使用 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;
}
}