3

これは、マルチキャストの受信を処理するためのTwistedの次のコード例です。現在、同じクライアントで多くのグループを聴いていますが、特定のデータグラムパケットがどのグループからのものであるかを印刷できるようにしたいと考えています。これは、datagramReceivedのアドレスパラメータから受け取ることができると思います。ただし、これにより、グループがバインドされているローカルIPとポートを含むタプルのみが提供され、グループ自体のアドレスは提供されません。

質問: Twistedプロトコル/ API内でデータグラムが発信された場所からマルチキャストアドレスを印刷するにはどうすればよいですか?

from twisted.internet.protocol import DatagramProtocol
from twisted.internet import reactor


class MulticastPingClient(DatagramProtocol):

    def startProtocol(self):
        # Join the multicast address, so we can receive replies:
        self.transport.joinGroup("228.0.0.5")
        self.transport.joinGroup("229.0.2.11")
        self.transport.joinGroup("221.3.3.3")
        # Send to 228.0.0.5:8005 - all listeners on the multicast address
        # (including us) will receive this message.
        self.transport.write('Client: Ping', ("228.0.0.5", 8005))

    def datagramReceived(self, datagram, address):
        print "Datagram %s received from %s" % (repr(datagram), repr(address))


reactor.listenMulticast(8005, MulticastPingClient(), listenMultiple=True)
reactor.run()
4

1 に答える 1

3

残念ながら、ソケット API の Twisted wraps (Python の標準ライブラリ経由) は、この情報を提供しません。マルチキャスト グループごとに個別の DatagramProtocol を用意し、それぞれ別のポートでリッスンすることをお勧めします。誰かが UDP データグラムをそのポートに直接送信することはできますが、それをマルチキャストと区別することはできません。

recvmsg() API が必要な情報を提供することを示す漠然とした記憶がありますが、これを確認する時間がありません。Twisted 12.1 には recvmsg() ラッパーが含まれているため、この機能を Twisted (またはあなたのコード) に追加するには、もう少し作業を加える必要があるかもしれません。

于 2012-07-09T18:53:55.620 に答える