1

私は、成功せずにマルチキャストで SocketServer python モジュールをリッスンする方法を見つけるために探し回っています。

誰でもそうすることができましたか?

どんな洞察も大歓迎です!

ありがとう

4

3 に答える 3

2

これは機能します。IGMP が送信され、マルチキャストが受信されることを確認できます。注意すべき重要なことは、マルチキャストが必要な場合は、UDPServer を任意にバインドし、スレッドを開始して (server.socket が作成されるように)、マルチキャスト メンバーシップを追加することです。

class MessageListenerUDP(SocketServer.ThreadingMixIn, SocketServer.UDPServer): pass
if LISTEN_UDP:
        if MULTICAST: server=MessageListenerUDP(('',PORT), MessageHandlerUDP)
        else: server=MessageListenerUDP((LISTEN_UDP,PORT), MessageHandlerUDP)
        server_thread=threading.Thread(target=server.serve_forever)
        server_thread.start()
        if MULTICAST:
            server.socket.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP,
                struct.pack("=4sl", socket.inet_aton(LISTEN_UDP), socket.INADDR_ANY))
于 2012-12-17T16:32:30.927 に答える
2

ドキュメント (http://docs.python.org/library/socketserver.html) は、マルチキャストとソース コード (http://hg.python.org/cpython/file/2.7/Lib) について言及していません。 /SocketServer.py) は、マルチキャスト リスナー (例: socket.IP_ADD_MEMBERSHIP) で表示されると予想されるソケット オプションを設定しないため、SocketServer はマルチキャストをサポートしていないと言えます。

UDPServer を作成しようとしていて、次のようなエラーが発生していると思います (発生しているエラーにコード スニペットを含めるようにしてください)。

socket.error: [Errno 10049] The requested address is not valid in its context

これは、UDPServer が TCPServer のサブクラスであり、TCPServer が作成されると、指定されたアドレスで bind() を呼び出すためです。ただし、リッスンするためにマルチキャストアドレスにバインドすることは想定されていません(したがってエラーです)。IP_ADD_MEMBERSHIPソケットオプションを使用して、マルチキャストトラフィックをリッスンします。

独自のマルチキャスト サーバーを展開する必要があるようです。

于 2012-09-10T18:58:06.643 に答える
0

UDPServer クラスを使用します。

http://docs.python.org/library/socketserver.html#socketserver-udpserver-example

于 2012-09-10T18:55:56.600 に答える