如何从Twisted中的datagramReceived获取多播组地址?

时间:2012-07-09 18:00:09

标签: python udp twisted multicast

这是来自Twisted的以下代码示例,用于处理多播的接收。我目前正在收听许多具有相同客户端的组,我希望能够打印出某个数据报包来自哪个组。我认为这可以从datagramReceived的address参数接收;但是,这只给了我一个元组,其中包含一个组绑定的本地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()

1 个答案:

答案 0 :(得分:3)

不幸的是,套接字API Twisted wrapps(通过Python的标准库)不提供此信息。我建议为每个组播组分别使用一个DatagramProtocol,并为每个组播组监听不同的端口。虽然有人仍然可以直接将UDP数据报发送到该端口,但您无法将其与多播区分开来。

我有一个模糊的内存,表明recvmsg()API确实提供了必要的信息,尽管我没有时间来验证这一点。 Twisted 12.1有一个recvmsg()包装器的开头,所以这可能是一种可能的方法,可以将这个功能添加到Twisted(或你的代码)中,并且需要更多的工作。