Raspbian

Raspbian - 廣播消息時權限被拒絕

  • July 5, 2021

我正在使用 raspbian 上的 Elixir/Erlang 包來嘗試建構一個簡單的 UDP 發送/接收應用程序。有關資訊,我正在使用本教程

當我嘗試通過提供給我的eth0介面的廣播 IP 地址將 UDP 數據包發送到網路時,我收到“權限被拒絕”消息。

真的不允許從linux向網路廣播UDP消息嗎?如果是這樣,如何授予特定包廣播消息的權限?我已經用localhostIP 地址 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 +++

erlangsetsockopt(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程式碼中。

引用自:https://unix.stackexchange.com/questions/656911