2014-07-11 8 views
7

Sto utilizzando il metodo GetAdapterAddresses() per ottenere gli indirizzi IP di tutte le interfacce sul sistema.Ottieni subnet mask da GetAdapterAddresses()

Devo trovare l'indirizzo di trasmissione di ogni interfaccia. Posso calcolare questo usando l'indirizzo IP e la subnet mask ma non riesco a vedere la subnet mask nella struttura IP_ADAPTER_ADDRESSES.

C'è un modo per recuperare la subnet mask utilizzando GetAdapterAddresses()?

risposta

10

GetAdapterAddresses() fornisce maschere di sottorete solo su Vista e successive.

Quando scorrendo gli indirizzi unicast puntata dal FirstUnicastAddress campo del record IP_ADAPTER_ADDRESSES, il record IP_ADAPTER_UNICAST_ADDRESS include un campo OnLinkPrefixLength. Questo campo non è disponibile su sistemi pre-Vista. Questo campo è la lunghezza della subnet mask, in bit. Per gli indirizzi unicast IPv4, è possibile utilizzare ConvertLengthToIpv4Mask() per convertire il valore OnLinkPrefixLength in una subnet mask, che è possibile utilizzare per mascherare l'indirizzo IPv4 unicast in base alle esigenze.

Su sistemi pre-Vista, utilizzare GetIpAddrTable() per ottenere un elenco delle interfacce IPv4 disponibili. Il record MIB_IPADDRROW contiene un campo dwAddr per l'indirizzo IPv4, un campo dwMask per la maschera di sottorete e un campo dwBCastAddr per l'indirizzo di trasmissione. Puoi scorrere ciclicamente quella tabella alla ricerca di ogni indirizzo IPv4 unicast riportato da GetAdapterAddresses(), e quindi avrai le relative maschere di sottorete e gli indirizzi IP broadcast.

+0

C'è un modo per convertire l'ULONG restituito da 'ConvertLengthToIpv4Mask()' a una rappresentazione di stringa (come "255.255.255.0")? – jossgray

+0

Ok, posso usare una struttura in_addr e inet_ntoa. Grazie. – jossgray

+1

Grazie per l'ottima risposta! Voglio solo aggiungere che la documentazione MSDN per IP_ADAPTER_UNICAST_ADDRESS è errata per Windows Embedded Compact 7. https://msdn.microsoft.com/en-us/library/ee494101(v=winembedded.70).aspx Non funziona elenca OnLinkPrefixLength, ma guardando i file .h, è lì. Ho confermato che è lì. (Lo stesso per le versioni più recenti). Non esiste in CE 6 o inferiore (adeguatamente documentato). – Bryan