私は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)
ブロードキャスト転送権限を有効/無効にします。
に追加する方法を理解する必要があります。ジロパスワード。