2012-07-28 1 views
0

twisted python의 멀티 캐스트 프로토콜을 실험하고 있습니다.Twisted Python : 멀티 캐스트 서버가 예상대로 작동하지 않습니다.

내가 224.0.0.1에 듣고, 두 서버를 생성하고 224.0.0.2 다음과 같은 :

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

class MulticastServerUDP(DatagramProtocol): 
    def __init__ (self, group, name): 
     self.group = group 
     self.name = name 
    def startProtocol(self): 
     print '%s Started Listening' % self.group 
     # Join a specific multicast group, which is the IP we will respond to 
     self.transport.joinGroup(self.group) 

    def datagramReceived(self, datagram, address): 
     print "%s Received:"%self.name + repr(datagram) + repr(address) 


reactor.listenMulticast(10222, MulticastServerUDP('224.0.0.1', 'SERVER1'), listenMultiple = True) 
reactor.listenMulticast(10222, MulticastServerUDP('224.0.0.1', 'SERVER2'), listenMultiple = True) 

reactor.run() 

가 그럼 난 "HELLO"보내려면이 코드를 실행 :

import socket 

MCAST_GRP = '224.0.0.1' 
MCAST_PORT = 10222 

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP) 
sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) 
sock.sendto("HELLO", (MCAST_GRP, MCAST_PORT)) 
이 간단한 예입니다

결과는 매우 혼란 스러웠습니다.

- 그룹 IP 및 MCAST_GRP를 모두 224.0.0.1로 설정하면 두 서버에서 모두 메시지 (예상)가 수신되었습니다. - 그룹 IP를 224.0.0.1 및 MCAST_GRP로 설정하면 모두 전송됩니다. 스크립트를 224.0.0.2 (또는 224.0.0.1과 다른 값)로 설정하면 두 서버가 메시지를받지 못했습니다. (예상)

- 하나의 서버의 그룹 IP를 224.0.0.1로 설정하고 다른 하나는 224.0.0.2로 설정하면 이상한 것들 우연히 있다. MCAST_GRP를 224.0.0.1 또는 224.0.0.2로 설정하면 두 서버 중 하나만 메시지를 수신 할 것으로 예상됩니다. 그 결과 두 서버 모두 메시지를 받았습니다. 무슨 일이 일어나고 있는지 잘 모르겠습니다. 누군가 이것을 설명 할 수 있습니까?

참고 : 동일한 컴퓨터에서 실행하고 있습니다.

SL

답변

1

멀티 캐스트 엉뚱한 및 플랫폼 (리눅스, 윈도우, OS의 X, 등)에 멀티 캐스트의 구현도 wackier이다.

Twisted는 여기에 플랫폼의 멀티 캐스트 동작을 반영하기 때문에 이것은 꼬인 관련 질문 일뿐입니다. 정말로 멀티 캐스트 질문과 플랫폼 질문입니다.

현재 상황에 대해 약간 숙련 된 추측이 있습니다.

멀티 캐스트는 호스트가 주소를 구독하도록하여 작동합니다. 호스트에서 실행중인 프로그램이 그룹에 합류하면 (예 : 224.0.0.1) 호스트가 로컬에서이를 메모하고 일부 네트워크 작업 (IGMP)을 통해 가까운 호스트에 알려줍니다 (라우터를 통해 가능할 수도 있음). 이 부분에 대한 세부 정보)를 통해 해당 그룹의 메시지에 관심이 있습니다.

멀티 캐스트 제작자의 이상적인 세계에서 구독은 인터넷을 통해 모든 방식으로 전파됩니다. 인터넷에있는 모든 사람이 그룹에 메시지를 보내면 라우터에 손을 대면 그룹에 가입 한 모든 호스트에 메시지를 전달할 수 있습니다. 구독 한 호스트 만 메시지를 전달해야하므로 브로드 캐스트보다 효율적입니다. 라우터는 구독을 추적하므로 가입 한 호스트가없는 링크로 트래픽을 보내는 것을 건너 뛸 수 있습니다.

실제 우주에서 멀티 캐스트 구독은 일반적으로 매우 멀리 전파되지 않습니다 (예 : 첫 번째 라우터, 아마도 집 LAN을 실행하는 라우터에 도달하고 거기에서 멈춤).

이상적인 우주에 대한 모든 정보가이 시나리오와 관련이없는 것처럼 보일 수 있습니다. 하나! 나의 의심은 멀티 캐스트를 구현하는 대부분의 사람들이 처음 부분에 대해 정말로 열심히 생각하고 그것을 구현 한 시점에 꽤 지쳤다는 것이다.

멀티 캐스트 그룹에 대한 메시지가 실제로 호스트에 도착하면 호스트는 실제로 해당 메시지를 원하는 프로그램에 전달해야합니다.여기서, 나는 구현 자들이 옳은 일을하기에는 너무 지쳤다 고 생각한다. 대신, 그들은 (플랫폼에 따라) 다양한 게으르고 쉬운 일을했습니다. 예를 들어, 그들 중 일부는 멀티 캐스트 그룹에 가입되어있는 시스템의 모든 단일 오픈 소켓을 방문하여 메시지를 전달했습니다.

다른 플랫폼에서는 단일 멀티 캐스트 메시지가 여러 수신 대기 멀티 캐스트 소켓에 두 번 이상 전달되는 경우가 있습니다. 물론 멀티 캐스트 메시지의 인기있는 문제는 전혀 전달되지 않습니다.

멀티 캐스트 땅에서 이상한 시간을 즐기십시오!

2

사실 조금 까다 롭습니다.

reactor.listenMulticast(
    10222, 
    MulticastServerUDP('224.0.0.1', 'SERVER1'), 
    listenMultiple=True, 
    interface='224.0.0.1' 
) 

reactor.listenMulticast(
    10222, 
    MulticastServerUDP('224.0.0.2', 'SERVER2'), 
    listenMultiple=True, 
    interface='224.0.0.2' 
) 

내가 전에 같은 문제가 있었다 : 당신은 이런 식으로 작성해야합니다. 나는 그것을 발견하기 위해 출처를 봐야했다. 그러나 C에서 네트워크 프로그래밍에 대한 내 배경 때문에 그것을 해결했습니다.