2012-07-09 1 views
2

다음은 멀티 캐스트 수신과 관련된 Twisted의 다음 코드 예제입니다. 나는 현재 같은 클라이언트를 가진 많은 그룹의 말을 듣고 있으며 특정 데이터 그램 패킷이 어느 그룹에서 왔는지를 출력 할 수 있기를 원합니다. 나는 이것이 datagramReceived의 주소 매개 변수로부터받을 수 있다고 생각한다. 그러나 이는 그룹에게 바인드 된 로컬 IP 및 포트를 포함하는 튜플을 제공하지만 그룹 자체의 주소는 제공하지 않습니다.Twisted에서 datagramReceived의 멀티 캐스트 그룹 주소를 얻는 방법?

질문 : 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() 

답변

3

아쉽게도 소켓 API Twisted Wraps (파이썬의 표준 라이브러리를 통해)는이 정보를 제공하지 않습니다. 각 멀티 캐스트 그룹에 대해 별도의 DatagramProtocol을 사용하고 각각 다른 포트에서 수신하는 것이 좋습니다. 누군가가 여전히 UDP 데이터 그램을 해당 포트로 직접 보낼 수는 있지만 멀티 캐스트와 구별 할 수는 없습니다.

나는 이것을 검증 할 시간이 없지만 recvmsg() API가 필요한 정보를 제공한다는 막연한 기억이 있습니다. Twisted 12.1은 recvmsg() 래퍼의 시작 부분을 가지고 있으므로, Twisted (또는 코드)에이 기능을 추가하는 방법이 될 수 있습니다.

+0

이렇게하면 여러 스레드가 호출됩니까? 모든 수준에서 잠금 기능이없는 데이터 구조에 데이터 그램을 쓰게하고 있습니다. – jab

+0

아니요, reactor.run() (또는 리액터 이벤트에서 예약 된 일부 함수) 전에 listenUDP를 여러 번 호출하십시오. 스레드가 필요 없습니다. –

+0

쿨, 고마워요! – jab