Raspbian
Raspbian - 廣播消息時權限被拒絕
我正在使用 raspbian 上的 Elixir/Erlang 包來嘗試建構一個簡單的 UDP 發送/接收應用程序。有關資訊,我正在使用本教程。
當我嘗試通過提供給我的
eth0
介面的廣播 IP 地址將 UDP 數據包發送到網路時,我收到“權限被拒絕”消息。真的不允許從linux向網路廣播UDP消息嗎?如果是這樣,如何授予特定包廣播消息的權限?我已經用
localhost
IP 地址 127.0.0.1 對其進行了測試,我沒有收到任何錯誤。
要使用 BSD 套接字 API 發送廣播,您必須聲明您的目的地是廣播地址。這是通過系統呼叫完成的
setsockopt(2)
。這是一個範例,自願不使用erlang,因為:
- 我不知道二郎
- 該問題與 erlang 無關,而是與 BSD 套接字 API 有關。
我將用 IPv4環回地址進行說明。localhost不僅是 127.0.0.1,而且目前是 127.0.0.1/8,因此是 127.0.0.0/8 網路塊的一部分。這意味著(至少目前在 Linux 上)這確實支持廣播語義,如下所示:
$ ip route get 127.255.255.255 broadcast 127.255.255.255 dev lo table local src 127.0.0.1 uid 1000 cache <local,brd>
因此,使用方便的命令進行複制,該
socat
命令是調試與應用程序通信的好工具:$ echo test | socat udp4-datagram:127.255.255.255:5555 - 2021/07/04 08:40:06 socat[327412] E sendto(5, 0x55976a7a1000, 5, 0, AF=2 127.255.255.255:5555, 16): Permission denied
這需要聲明目的地是廣播:
$ echo test | socat udp4-datagram:127.255.255.255:5555,broadcast - $ echo $? 0 $ echo test | strace -e trace=socket,setsockopt,sendto -- socat udp4-datagram:127.255.255.255:5555,broadcast - socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP) = 5 setsockopt(5, SOL_SOCKET, SO_BROADCAST, [1], 4) = 0 sendto(5, "test\n", 5, 0, {sa_family=AF_INET, sin_port=htons(5555), sin_addr=inet_addr("127.255.255.255")}, 16) = 5 +++ exited with 0 +++
erlang
setsockopt(2)
在其inet模組文件參考中有參考:socket_setopt()
.socket_setopt() = gen_sctp:option() | gen_tcp:option() | gen_udp:option()
setopts(Socket, Options) -> ok | {error, posix()} Types Socket = socket() Options = [socket_setopt()]
為套接字設置一個或多個選項。
{broadcast, Boolean} (UDP sockets)
啟用/禁用發送廣播的權限。
您必須弄清楚如何將其添加到您的erlang程式碼中。