UDPでマルチキャストを使う(マルチキャストを受信する)
ここでは、UDPでマルチキャストパケットを受信する方法を説明したいと思います。
マルチキャスト受信サンプル
以下のサンプルは、前述したマルチキャスト送信サンプルからのパケットを受け取ります。
#!/usr/bin/ruby
require "socket"
require "ipaddr"
udps = UDPSocket.open()
udps.bind("0.0.0.0", 10000)
mreq = IPAddr.new("239.192.1.2").hton + IPAddr.new("0.0.0.0").hton
udps.setsockopt(Socket::IPPROTO_IP, Socket::IP_ADD_MEMBERSHIP, mreq)
p udps.recv(65535)
udps.close
マルチキャストパケットを受け取るには、マルチキャストグループに「参加(JOIN)」しなくてはなりません。 マルチキャストグループへの参加は、setsockoptを利用して行えます。
setsockoptを利用するポイントとしては、bindを行った後に行う必要があることが挙げられます。 マルチキャストグループへの参加を行うためには、参加するグループを表すマルチキャストアドレスと利用するネットワークインターフェースを指定しなくてはなりません。ネットワークインターフェースにINADDR_ANYを指定することにより、明示的に利用するネットワークインターフェースを指定しないことも出来ます。ただし、bindを行ったネットワークインターフェースとIP_ADD_MEMBERSHIPをINADDR_ANYで指定したときのネットワークインターフェースが一致する保障はありません。
一度JOINしたマルチキャストグループから「脱退(LEAVE)」するには、setsockoptをIP_DROP_MEMBERSHIPで行います。