UDPでブロードキャストを使う

ここでは、UDPでブロードキャストパケットを送る方法を説明したいと思います。

UDPブロードキャスト送信サンプル

何もしない状態のUDPソケットでは、ブロードキャストパケットを送信できません。 setsockopt()を利用してソケットに対してSO_BROADCASTを設定すると、ブロードキャストパケットを送信できるようになります。 この設定を行わずにブロードキャストパケットを送ろうとすると、send()が失敗してしまいます。

以下に、setsockopt()をしてからブロードキャストパケットを送信するサンプルを示します。


#!/usr/bin/ruby

require "socket"

udp = UDPSocket.open()

sockaddr = Socket.pack_sockaddr_in(10000, "255.255.255.255")

udp.setsockopt(Socket::SOL_SOCKET, Socket::SO_BROADCAST, 1)

udp.send("HELLO", 0, sockaddr)

udp.close

このサンプルで利用している「255.255.255.255」という宛先は、サブネット内の全てのノードを表します。 255.255.255.255が宛先のパケットはルータを越えません。

ブロードキャストで注意が必要なのは、ルータを越えるブロードキャストです。 ルータを越えるブロードキャストであるサブネットブロードキャストは、IPアドレスのホスト部を全て1にしたアドレスです。

昔は普通にサブネットブロードキャストを使えていましたがDoS攻撃などに多用されてしまったため、現在はルータでのブロードキャストパケット転送を許可しないのが一般的です。 送信側ホストからはパケットが出ているけど受信側ホストにブロードキャストパケットが届かない場合には、受信側の一つ手前のルータが転送しているかどうかも疑ってみてください。

プロフェッショナルIPv6解説動画シリーズ再生リスト

動画で学ぶ「プロフェッショナルIPv6」を作っています。 もしよろしければご覧ください。お楽しみいただければ幸いです!