Raspbian - メッセージの放送中に権限が拒否されました。

Raspbian - メッセージの放送中に権限が拒否されました。

私はRaspbianでElixir / Erlangパッケージを使って単純なUDP送受信アプリケーションを構築しようとしています。情報として使用していますこのチュートリアル

インターフェイスで指定したブロードキャストIPアドレスのネットワークにUDPパケットを送信しようとすると、eth0「許可を拒否」というメッセージが表示されます。

LinuxからネットワークにUDPメッセージをブロードキャストすることは本当に許可されていませんか?それでは、特定のパッケージにメッセージブロードキャスト権限をどのように付与しますか? IPアドレス127.0.0.1を使用してテストしましたが、localhostエラーは発生しませんでした。

ベストアンサー1

BSDソケットAPIを使用してブロードキャストを送信するには、宛先がブロードキャストアドレスであることを宣言する必要があります。これはシステムコールを介して行われます。setsockopt(2)

これは例であり、任意に使用しないでください。ジロなぜなら:

  • 全然知らないジロ
  • 問題はerlangとは関係がなく、BSDソケットAPIに関連しています。

説明するためにIPv4を使用します。ループバック住所ローカルホスト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 +++

ジロsetsockopt(2)その参考資料の中ではイントラネット基準寸法ドキュメント参照: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()]

ソケットに1つ以上のオプションを設定します。

{broadcast, Boolean} (UDP sockets)

ブロードキャスト転送権限を有効/無効にします。

に追加する方法を理解する必要があります。ジロパスワード。

おすすめ記事