2011-05-09 14 views
3

일부 IPv6 및 멀티 캐스트 네트워크 통신을 위해 부스트를 사용하려고합니다. 특정 네트워크 인터페이스 인덱스를 사용하는 IPv6 멀티 캐스트 소켓을 만들어야합니다. (CONST 부스트 :: ASIO :: IP : address_v6 & multicast_address 명시 적 multicast_request :IPv6의 올바른 "네트워크 인터페이스"번호 찾기

나는/ASIO/IP/세부/socket_option.hpp 향상에 네트워크 인터페이스 인덱스를 설정하는 올바른 멀티 캐스트 옵션을 찾을 수 있었다 서명되지 않은 long network_interface = 0)

문제는 "network_interface"매개 변수에 올바른 값을 찾는 방법을 모르겠다는 것입니다. 내가 제공 할 수있는 로컬 IPv6 주소를 사용하여 network_interface 값을 가져 오는 방법이 있습니까? 나는 문서와 예제를 살펴 보았지만 아무것도 찾을 수 없었다.

-

답변

1

나는이 알아낼 수있는 플랫폼 독립적 인 방법이 no portable solution to enumerating the local addresses가있는 것처럼 생각하지 않습니다 딜런.

Linux의 경우 /proc/net/if_inet6의 두 번째 열에서 원하는 것을 찾을 수 있으며 rtnetlink(7) 인터페이스를 통해 더욱 강력하게 사용할 수 있습니다.

2

각 플랫폼은 네트워크 인터페이스를 열거하는 API를 제공합니다. 많은 Unixes는 getifaddrs이고 Windows는 GetAdaptersAddresses입니다. Windows에서 IPv4 및 IPv6 어댑터 용으로 별도의 숫자 공간이 있으므로 API 호출 if_nametoindex은 매우 혼란 스럽습니다.

당신은 정말 유용 어댑터 이름이없는 윈도우를 고려, 내가 이식성 OpenPGM에 사용 된 방법을 검사 할 수 있습니다

http://code.google.com/p/openpgm/source/browse/trunk/openpgm/pgm/getifaddrs.c

http://code.google.com/p/openpgm/source/browse/trunk/openpgm/pgm/nametoindex.c

http://code.google.com/p/openpgm/source/browse/trunk/openpgm/pgm/indextoaddr.c

http://code.google.com/p/openpgm/source/browse/trunk/openpgm/pgm/indextoname.c

+0

나는'if_nametoindex (3)'functi를 사용했다. 리눅스에, 그리고 완벽하게 작동합니다. 즉,'int interfaceIndex = if_nametoindex ("eth0"); boost :: asio :: ip :: multicast :: join_group (address.to_v6(), interfaceIndex));' – uldall

관련 문제