目前我正在嘗試使用 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是正確的決定......
uj5u.com熱心網友回復:
答案很簡單,檢查防火墻設定。這是我的問題,我的本地防火墻阻止廣播到 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;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/439206.html
