pythonでマルチキャストを受信する


#!/usr/bin/env python
import socket
import sys

# データを受信するインターフェースをIPアドレスで指定。
# 全てのインターフェースを指定するときはinaddr_any 0.0.0.0にする。
multicast_if_addr='10.0.1.2'

# マルチキャストアドレス
multicast_group='224.3.29.71'
multicast_port=9999

my_addr='0.0.0.0'
server_address=(my_addr, multicast_port)

# ここまではUDP受信ソケットと同じ
sock=socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind(server_address)

# マルチキャストを受けるにはsetsockopt(..,IP_ADD_MEMBERSHIP,..)で
# マルチキャストグループに登録する。
# IP_ADD_MEMBERSHIPの値はin.hに定義されているstruct ip_mreq。
# struct ip_mreq /* found in in.h */
# {
# struct in_addr imr_multiaddr; /* IP multicast address of group */
# struct in_addr imr_interface; /* local IP address of interface */
# };
# 一般的にはstruct.pack()でバイトパターンをつくるが、ここでは安易にraw stringを結合。
mreq=socket.inet_aton(multicast_group)+socket.inet_aton(multicast_if_addr)
sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)

while True:

data, address=sock.recvfrom(1024)
print data

参考

doug hellmannのこの解説にもとづく http://www.doughellmann.com/PyMOTW/socket/multicast.html
この例ではクライアントにパケットを送り返す仕様になっている。