这是来自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()
答案 0 :(得分:3)
不幸的是,套接字API Twisted wrapps(通过Python的标准库)不提供此信息。我建议为每个组播组分别使用一个DatagramProtocol,并为每个组播组监听不同的端口。虽然有人仍然可以直接将UDP数据报发送到该端口,但您无法将其与多播区分开来。
我有一个模糊的内存,表明recvmsg()API确实提供了必要的信息,尽管我没有时间来验证这一点。 Twisted 12.1有一个recvmsg()包装器的开头,所以这可能是一种可能的方法,可以将这个功能添加到Twisted(或你的代码)中,并且需要更多的工作。