2014-07-11 2 views
7

GetAdapterAddresses() 메서드를 사용하여 시스템의 모든 인터페이스에 대한 IP 주소를 가져옵니다.GetAdapterAddresses()에서 서브넷 마스크 가져 오기

각 인터페이스의 브로드 캐스트 주소를 찾아야합니다. 이 IP 주소 및 서브넷 마스크를 사용하여 계산할 수 있지만 IP_ADAPTER_ADDRESSES 구조에서 서브넷 마스크를 볼 수 없습니다.

GetAdapterAddresses()을 사용하여 서브넷 마스크를 검색 할 수있는 방법이 있습니까?

답변

10

GetAdapterAddresses()은 Vista 이상에서만 서브넷 마스크를 제공합니다. IP_ADAPTER_ADDRESSES 레코드의 필드 FirstUnicastAddress함으로써 IP_ADAPTER_UNICAST_ADDRESS 레코드가 OnLinkPrefixLength 필드에 포함

유니 캐스트 주소를 통해 반복 가리켰다. 이 필드는 Vista 이전 시스템에서는 사용할 수 없습니다. 이 필드는 서브넷 마스크의 길이 (비트)입니다. IPv4 유니 캐스트 주소의 경우 ConvertLengthToIpv4Mask()을 사용하여 OnLinkPrefixLength 값을 서브넷 마스크로 변환 한 다음 필요에 따라 유니 캐스트 IPv4 주소를 마스크 할 수 있습니다.

Vista 시스템 이전에는 GetIpAddrTable()을 사용하여 사용 가능한 IPv4 인터페이스 목록을 가져옵니다. MIB_IPADDRROW 레코드는 IPv4 주소의 경우 dwAddr 필드, 서브넷 마스크의 경우 dwMask 필드 및 브로드 캐스트 주소의 dwBCastAddr 필드를 포함합니다. 해당 테이블을 반복하여 GetAdapterAddresses()에 의해보고 된 유니 캐스트 IPv4 주소를 찾은 다음 관련 서브넷 마스크와 브로드 캐스트 IP 주소를 갖게됩니다.

+0

'ConvertLengthToIpv4Mask()'에 의해 반환 된 ULONG을 ("255.255.255.0"처럼) 문자열 표현으로 변환하는 방법이 있습니까? – jossgray

+0

Ok in_addr 구조체와 inet_ntoa를 사용할 수 있습니다. 감사. – jossgray

+1

위대한 답변을 주셔서 감사합니다 btw! Windows Embedded Compact 7의 IP_ADAPTER_UNICAST_ADDRESS에 대한 MSDN 설명서가 잘못되었음을 추가하고 싶습니다. https://msdn.microsoft.com/en-us/library/ee494101(v=winembedded.70).aspx OnLinkPrefixLength를 나열하지만 .h 파일을 보면, 거기에 있습니다. 나는 그것이 거기에 있음을 확인했다. (최신 버전에서도 동일). CE 6 또는 그 이하에 존재하지 않습니다 (적절하게 문서화 됨). – Bryan

관련 문제