2017-02-24 7 views
2

나는 우분투 16.04에서 일하고있다. 멀티 캐스트 그룹에 가입/탈퇴하는 UDP 소켓을 만드는 C++ 코드입니다.Ubuntu C++ 멀티 캐스트 이중 떠남 그룹 메시지

그룹 가입/퇴장 코드가 작동하지만 그걸 가지고 놀고 있었는데 wireshark에서 뭔가를 알아 차렸고 그에 대한 정보를 찾을 수 없습니다.

나가기 전에 코드가 종료됩니다. Wireshark는 2 개의 그룹 메시지를 남깁니다. 코드가 종료되면 커널이 소켓을 닫고 그룹 그룹 메시지를 보냅니다. 하지만 왜 2? 항상 2입니다.

편집 : 또한 내가 wireshark를 떠날 때 전화를 걸 때 그룹 메시지를 남깁니다. 함수가 한 번만 실행됩니다 (인쇄 때문에). 2 메시지가 정상적으로 작동합니까?

또한 조인 기능에 대한 프린트를 추가했는데 한 번만 호출되었지만 wireshark가 2 조인 메시지를 가져 오는 경우가 있습니까? 이것은 때때로 발생합니다. 나는 이것에 대해 전혀 모른다.

하지만 코드가 작동하기 때문에 커널이 이러한 작업을 처리하는 방법과 관련이 있다고 생각합니까?

ip_mreq multicastRequest; 
std::cout << "leaveGroup called" << std::endl; 
multicastRequest.imr_multiaddr.s_addr = inet_addr(multicastGroup.c_str()); 
multicastRequest.imr_interface.s_addr = inet_addr(interfaceAddress(interface).c_str()); 
setsockopt(sockDesc_, IPPROTO_IP, IP_DROP_MEMBERSHIP,&multicastRequest, sizeof(multicastRequest)) 

답변

3

RFC 3376 Section 8.1에 설명되어 있습니다 : 코드에서

내가 가입

ip_mreq multicastRequest; 
std::cout << "joinGroup called" << std::endl; 
multicastRequest.imr_multiaddr.s_addr = inet_addr(multicastGroup.c_str()); 
multicastRequest.imr_interface.s_addr = inet_addr(interfaceAddress(interface).c_str()); 
setsockopt(sockDesc_, IPPROTO_IP, IP_ADD_MEMBERSHIP,&multicastRequest, sizeof(multicastRequest)) 

과 휴가에 대한 같은 것을 할. 모든 IGMP 쿼리는 견고성 변수으로 알려진 여러 번 반복됩니다. 강건성 변수의 기본값은 2로 기본값이며 sysctl net.ipv4.igmp_qrv으로 조정할 수 있습니다.

$ sysctl net.ipv4.igmp_qrv 
net.ipv4.igmp_qrv = 2 
$ sudo sysctl net.ipv4.igmp_qrv=1 
net.ipv4.igmp_qrv = 1