複数のマルチキャストを同時に受信する方法
説明
複数のマルチキャストを同時に受信してファイルに出力するプログラムをPython3.6で作成しています。
単一のスレッドで受信することはできたのですが、複数のスレッドを同時に実行したとき正常に動作しません。
例えばマルチキャストのデータが2つ配信されていて(マルチキャストA,B)、2つのスレッドで受信したとき(スレッドA,B)、スレッドAが作成したファイルに、マルチキャストA,B両方のデータが出力されてしてしまいます。(スレッドBも同様)
スレッドAのファイルにはマルチキャストA、スレッドBにはマルチキャストBというようにファイルを作成するにはどうすればよいでしょうか。
動作OSはCentOS7.2です。
コード
python
1def receive(m_addr, m_port, if_addr): 2 filename = "%s_%d.dat" % (m_addr, m_port) 3 with open(filename, "wb") as f: 4 with closing(socket.socket(socket.AF_INET, socket.SOCK_DGRAM)) as sock: 5 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 6 sock.bind(('', m_port)) 7 mreq = socket.inet_aton(m_addr) + socket.inet_aton(if_addr) 8 sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq) 9 while 継続条件: 10 buf = sock.recv(1024) 11 # ファイル出力 12 13 sock.setsockopt(socket.IPPROTO_IP, socket.IP_DROP_MEMBERSHIP, mreq) 14 15if __name__ == '__main__': 16 # スレッドA起動(target=receive, args=("224.0.0.1", 5000, "192.168.0.1")) 17 # スレッドB起動(target=receive, args=("224.0.0.2", 5000, "192.168.0.1")) 18 19 # スレッド終了待機
追記
sock.recvfrom
を使用することで、マルチキャストの送信元IPアドレスを取得することができたため、送信元さえ知っていれば判断することができるようになりました。
マルチキャストの送信先は取得できないでしょうか?
(buf, addr) = sock.recvfrom(1024)
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/08/01 05:35