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

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()
1个回答

3

很遗憾,Twisted所包装的套接字API(通过Python的标准库)没有提供这些信息。我建议为每个组播组使用单独的DatagramProtocol,并为每个组使用不同的端口进行监听。虽然某些人仍可能直接向该端口发送UDP数据报文,但您无法将其与多播区分开来。

我模糊地记得recvmsg() API确实提供了必要的信息,尽管我没有时间验证。Twisted 12.1拥有一个recvmsg()包装器的开端,因此可能需要更多的工作来将此功能添加到Twisted(或您的代码)中。


这样做会调用多个线程吗?我将数据报写入一个没有任何层次锁定的数据结构中。 - jab
不,只需在 reactor.run() 之前多次调用 listenUDP(或者从某个由 reactor 事件调度的函数中调用)- 不需要使用线程。 - Itamar Turner-Trauring

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接