2012-10-22 1 views
3

이것은 Windows 7의 C++입니다. 나는 일종의 초심자 인 멀티 캐스트 소켓 사용자이며,이 코드를 다른 사람으로부터 상속받습니다.Windows 7 멀티 캐스트 수신 중지 몇 분 후 수신

ADDR 225.1.1.2에서 멀티 캐스트 소켓을 만들거나 가입하는 여러 대의 컴퓨터가 있는데 왜 소켓이 연결되면 정기적으로 서로 "다양한"메시지를 보내면서 "채팅"합니다. 네트워크에서 하나의 컴퓨터 ("A"라고 함)를 시작하고 초당 한 번씩 "keepalive"메시지를 주기적으로 보내지 만 아무 것도 수신되지 않고 (다른 사람이 멀티 캐스트 주소에 연결되어 있지 않음) 앉아서 둡니다 약 3 분 동안 다른 컴퓨터 B를 시작하면 첫 번째 컴퓨터 A는 컴퓨터 B의 브로드 캐스트 메시지를 보지 못합니다! B는 패킷을 보내는 데 오류가 없으며 A는 아무 것도 수신하지 않습니다 (수신은 호출되지 않습니다). 무언가가 수신부를 종료하거나 어떻게 그러한 정보를 등록 할지를 알리는 방법을 알지 못합니다.

두 머신을 서로 가깝게 시작하면 각 머신은 다른 하나의 keepalive 패킷을 봅니다. 두 컴퓨터에서 모두 수신됩니다. 그러나 첫 번째 컴퓨터를 시작한 후 3 분이 지나면 두 번째 컴퓨터를 시작하면 첫 번째 컴퓨터의 수신 방법이 잠자기 상태가되거나 사라 졌거나 혼수 상태에 빠진 것 같습니다. 오류는 발생하지 않지만 일반 컴퓨터 B의 패킷을 볼 수 없습니다. (게다가, 디버거 출력에서 ​​3 개의 쓰레드가 종료 된 것을 볼 수 있습니다.하지만 생성 된 쓰레드가 아니라 시스템 쓰레드입니다.)

다음
hSock = WSASocket(
    AF_INET, 
    SOCK_DGRAM, 
    0, 
    NULL, 
    0, 
    WSA_FLAG_MULTIPOINT_C_LEAF | WSA_FLAG_MULTIPOINT_D_LEAF | WSA_FLAG_OVERLAPPED); 

setsockopt(hSock,SOL_SOCKET,SO_REUSEADDR,(char *) &bVal,sizeof(bVal)); 
srcIP.sin_family=AF_INET; 

// Need to bind to local interface 
srcIP.sin_addr.s_addr=inet_addr(("225.1.1.2"); // htonl(INADDR_ANY); 
srcIP.sin_port=htons(5555); 
bind(hSock,(struct sockaddr FAR *) &srcIP,sizeof(srcIP)); 

nIP_TTL=36; 
setsockopt(hSock,IPPROTO_IP,IP_MULTICAST_TTL,(char *) &nIP_TTL,sizeof(int)); 

mreq.imr_multiaddr.s_addr=inet_addr("225.1.1.2"); 
mreq.imr_interface.s_addr=inet_addr("225.1.1.2"); 
setsockopt(hSock,IPPROTO_IP,IP_ADD_MEMBERSHIP,(char *) &mreq,sizeof(mreq)); 

내가 인터넷에서 건너 온 한 내용은 다음과 같습니다 :

그러나 기계 B는 하나 가장 최근에, 기계 A. 여기

에서 킵 얼라이브 패킷을 참조하는 일은 소켓 호출의 시작

  1. 수신 버퍼가 가득 찼을 수 있습니다. (컴퓨터 A는 멀티 캐스트를 사용하는 네트워크의 유일한 사람이기 때문에 그렇게 생각하지 않습니다.)
  2. 방화벽은 몇 분 후에 멀티 캐스트 수신을 해제로 설정할 수 있습니다. (나는 이것을 믿지 않는다)
  3. 비 활동 중 X 분 후에 WinSock 프로토콜이 멀티 캐스트를 수신 할 수있다. (나는 이것도 믿지 않는다)

답변

1

나는 위의 코드에서 실수가 있다고 생각한다. imr_interface (일반적으로 컴퓨터의 IP 주소가 아니라 멀티 캐스트 주소)에 대한 컴퓨터 네트워크 인터페이스의 로컬 IP 주소를 지정해야한다고 생각합니다. 즉, 멀티 캐스트 트래픽을 송수신하려는 인터페이스입니다. 귀하의 코드가 멀티 캐스트 그룹에 전혀 참여하지 않았다고 가정하고 잠시 우연히 만났습니다.

IP_ADD_MEMBERSHIP을 전혀 호출하지 않은 경우에도 2 분 정도 걸릴 수 있습니다.

이상한 3 분 동작은 작동하지 않는 조인이나 IGMP 스누핑 문제와 완벽하게 비슷합니다.

IPv4 멀티 캐스트는 매우 미묘하며 호스트, 운영 체제 및 내부 하드웨어 구성 요소의 동작 또한 매우 미묘합니다.

운영 체제는 응용 프로그램이 멀티 캐스트를 처리 할 때 IGMP 메시지를 보내고받습니다. 이 작업은 자동으로 수행되며 IP_ADD_MEMBERSHIP 등의 올바른 호출을 사용하지만 이에 대한 제어 권한은 없습니다. inbetween 하드웨어 구성 요소 (WLAN 라우터, 스위치, Powerline-Adapters 등)는 모두 멀티 캐스트 작업을 수행하는 데 마술을 사용하며,이 마법은 문제를 숨기고 문제를 만드는 경향이 있습니다.

예 : 프로세스가 멀티 캐스트 주소 X에 대해 IP_ADD_MEMBERHIP을 호출하면 시스템의 다른 모든 프로세스는 IP_ADD_MEMBERSHIP를 호출하지 못해도 주소 X의 멀티 캐스트 트래픽을 볼 수 있습니다.

누락 된 (또는 가짜) ADD_MEMBERSHIP의 일반적인 증상은 다음과 같습니다. 몇 분 (일반적으로 3-5 분) 동안 작동 한 다음 케이블을 당긴 것처럼 갑자기 작동을 멈 춥니 다. 프로그램 중 하나를 다시 시작하면 다음 3-5 분 동안 문제가 다시 해결됩니다. 그러나 100 % 올바른 ADD_MEMBERSHIP을 사용하더라도 Powerline-Adapter와 같은 사소한 네트워크 구성 요소를 통과 할 때 이러한 증상을 나타낼 수 있습니다. 다음은 사용중인 OS와 사용중인 라우터/스위치/어댑터 사이의 일종의 비 호환성입니다.

디버깅하려면 호스트 OS의 IGMP 상태를 검사하십시오. Windows에서이 작업을 수행하는 방법을 모르겠습니다.