2014-07-13 4 views
0

은 내가 UDP 소켓을연결된 모든 네트워크에서 UDP 멀티 캐스트를 어떻게 보낼 수 있습니까?

192.168.0.2 - real network card (interface id: 10) 
192.168.180.1 - vmware adapter 1 (interface id: 21) 
192.168.139.1 - vmware adapter 2 (interface id: 22) 

(내 윈도우 7에서) 세 개의 네트워크 인터페이스가 (AF_INET), 바인드 호출에 의한 요지에 바인딩되지된다.

239.255.255.250으로 데이터 그램을 보내려고합니다. Wireshark에서 볼 수 있듯이 192.168.139.0/24 네트워크를 통해 데이터 그램을 보내는 데는 192.168.139.1 소스 주소 만 사용됩니다.

는 내가하는 인터페이스는 데이터 그램을 전송해야 Winsock을 할 말해 setsockopt를 호출 할 필요가 있다고 생각 :

UINT adapterId = 10; 
setsockopt(sock, IPPROTO_IP, IP_MULTICAST_IF, (char*)&adapterId, sizeof(adapterId)); 

하지만 난 여기 10049 (WSAEADDRNOTAVAIL) 오류가 발생했습니다.

실제 네트워크 또는 멀티 홈 호스트의 모든 네트워크에서 데이터 그램을 보낼 수있는 방법은 무엇입니까?

오래전에 내 코드 (setsockopt 호출없이)는 WinXP에서 잘 작동했지만 기억할 수없는 시스템 하나의 네트워크 어댑터 또는 여러 개가 있습니다.

답변

2

당신은 올바른 길을 가고 있습니다. 위의 코드에 따라 차례대로 각 NIC를 통해 보내는 모든 NIC를 반복해야합니다. 10049는 잘못된 주소 또는이 호스트에 로컬이 아닌 주소를 지정하여 발생합니다. 이 경우 IP 주소 대신 어댑터 ID를 잘못 전달합니다.

+0

문제가 어리 석습니다. 잘못된 문서를 읽었습니다. IP_MULTICAST_IF adapterId는 네트워크가 아닌 호스트 바이트 순서 여야합니다. 다른 문서에서는이 점에서 차이점을 발견하고 htonl을 추가했습니다. 그 후, IP_MULTICAST_IF 설정은 실패하지 않고 모든 데이터 그램은 모든 네트워크로 전송된다. –

+0

사실 ip_mreqn.imr_address 필드에서 한 번의 호출로 NIC의 IP 주소를 지정하는'IP_ADD_MEMBERSHIP'을 할 수있다. – EJP