Condividi tramite


struttura MIB_UNICASTIPADDRESS_ROW (netioapi.h)

La struttura MIB_UNICASTIPADDRESS_ROW archivia informazioni su un indirizzo IP unicast.

Sintassi

typedef struct _MIB_UNICASTIPADDRESS_ROW {
  SOCKADDR_INET    Address;
  NET_LUID         InterfaceLuid;
  NET_IFINDEX      InterfaceIndex;
  NL_PREFIX_ORIGIN PrefixOrigin;
  NL_SUFFIX_ORIGIN SuffixOrigin;
  ULONG            ValidLifetime;
  ULONG            PreferredLifetime;
  UINT8            OnLinkPrefixLength;
  BOOLEAN          SkipAsSource;
  NL_DAD_STATE     DadState;
  SCOPE_ID         ScopeId;
  LARGE_INTEGER    CreationTimeStamp;
} MIB_UNICASTIPADDRESS_ROW, *PMIB_UNICASTIPADDRESS_ROW;

Members

Address

Tipo: SOCKADDR_INET

Indirizzo IP unicast. Questo membro può essere un indirizzo IPv6 o un indirizzo IPv4.

InterfaceLuid

Tipo: NET_LUID

Identificatore univoco locale (LUID) per l'interfaccia di rete associata a questo indirizzo IP.

InterfaceIndex

Tipo: NET_IFINDEX

Valore dell'indice locale per l'interfaccia di rete associata a questo indirizzo IP. Questo valore di indice può cambiare quando una scheda di rete è disabilitata e quindi abilitata o in altre circostanze e non deve essere considerata persistente.

PrefixOrigin

Tipo: NL_PREFIX_ORIGIN

Origine del prefisso o della parte di rete dell'indirizzo IP. Questo membro può essere uno dei valori del tipo di enumerazione NL_PREFIX_ORIGIN definito nel file di intestazione Nldef.h .

Valore Significato
IpPrefixOriginOther
0
Il prefisso dell'indirizzo IP è stato configurato usando un'origine diversa da quella definita in questa enumerazione. Questo valore è applicabile a un indirizzo IPv6 o IPv4.
IpPrefixOriginManual
1
Il prefisso dell'indirizzo IP è stato configurato manualmente. Questo valore è applicabile a un indirizzo IPv6 o IPv4.
IpPrefixOriginWellKnown
2
Il prefisso dell'indirizzo IP è stato configurato usando un indirizzo noto. Questo valore è applicabile a un indirizzo locale di collegamento IPv6 o a un indirizzo di loopback IPv6.
IpPrefixOriginDhcp
3
Il prefisso dell'indirizzo IP è stato configurato tramite DHCP. Questo valore è applicabile a un indirizzo IPv4 configurato tramite DHCP o un indirizzo IPv6 configurato tramite DHCPv6.
IpPrefixOriginRouterAdvertisement
4
Il prefisso dell'indirizzo IP è stato configurato usando l'annuncio del router. Questo valore è applicabile a un indirizzo IPv6 anonimo generato dopo la ricezione di un annuncio router.
IpPrefixOriginUnchanged
16
Il prefisso dell'indirizzo IP deve essere invariato. Questo valore viene usato quando si impostano le proprietà per un'interfaccia IP unicast quando il valore per l'origine del prefisso IP deve essere invariato.

SuffixOrigin

Tipo: NL_SUFFIX_ORIGIN

Origine del suffisso o parte host dell'indirizzo IP. Questo membro può essere uno dei valori del tipo di enumerazione NL_SUFFIX_ORIGIN definito nel file di intestazione Nldef.h .

Valore Significato
IpSuffixOriginOther
0
Il suffisso dell'indirizzo IP è stato configurato usando un'origine diversa da quelle definite in questa enumerazione. Questo valore è applicabile a un indirizzo IPv6 o IPv4.
IpSuffixOriginManual
1
Il suffisso dell'indirizzo IP è stato configurato manualmente. Questo valore è applicabile a un indirizzo IPv6 o IPv4.
IpSuffixOriginWellKnown
2
Il suffisso dell'indirizzo IP è stato configurato usando un indirizzo noto. Questo valore è applicabile a un indirizzo locale di collegamento IPv6 o a un indirizzo di loopback IPv6.
IpSuffixOriginDhcp
3
Il suffisso dell'indirizzo IP è stato configurato tramite DHCP. Questo valore è applicabile a un indirizzo IPv4 configurato tramite DHCP o un indirizzo IPv6 configurato tramite DHCPv6.
IpSuffixOriginLinkLayerAddress
4
Il suffisso dell'indirizzo IP è l'indirizzo locale del collegamento. Questo valore è applicabile a un indirizzo locale di collegamento IPv6 o a un indirizzo IPv6 in cui la parte di rete è stata generata in base a un annuncio del router e la parte host si basava sull'indirizzo hardware MAC.
IpSuffixOriginRandom
5
Il suffisso dell'indirizzo IP è stato generato in modo casuale. Questo valore è applicabile a un indirizzo IPv6 anonimo in cui la parte host dell'indirizzo è stata generata in modo casuale dall'indirizzo hardware MAC dopo aver ricevuto un annuncio router.
IpSuffixOriginUnchanged
16
Il suffisso dell'indirizzo IP deve essere invariato. Questo valore viene usato quando si impostano le proprietà per un'interfaccia IP unicast quando il valore per l'origine del suffisso IP deve essere invariato.

ValidLifetime

Tipo: ULONG

Tempo massimo, in secondi, valido per l'indirizzo IP. Un valore di 0xffffffff viene considerato infinito.

PreferredLifetime

Tipo: ULONG

Il tempo preferito, in secondi, che l'indirizzo IP è valido. Un valore di 0xffffffff viene considerato infinito.

OnLinkPrefixLength

Tipo: UINT8

Lunghezza, in bit, del prefisso o della parte di rete dell'indirizzo IP. Per un indirizzo IPv4 unicast, qualsiasi valore maggiore di 32 è un valore non valido. Per un indirizzo IPv6 unicast, qualsiasi valore maggiore di 128 è un valore non valido. Il valore 255 viene comunemente usato per rappresentare un valore non valido.

SkipAsSource

Tipo: BOOLEAN

Questo membro specifica se l'indirizzo può essere usato come indirizzo di origine IP.

DadState

Tipo: NL_DAD_STATE

Stato di rilevamento degli indirizzi duplicati ( DAD). Il rilevamento degli indirizzi duplicati è applicabile sia agli indirizzi IPv6 che IPv4. Questo membro può essere uno dei valori del tipo di enumerazione NL_DAD_STATE definito nel file di intestazione Nldef.h .

Valore Significato
IpDadStateInvalid
0
Lo stato DAD non è valido.
IpDadStateTentative
1
Lo stato DAD è provvisorio.
IpDadStateDuplicate
2
È stato rilevato un indirizzo IP duplicato.
IpDadStateDeprecated
3
L'indirizzo IP è stato deprecato.
IpDadStatePreferred
4
L'indirizzo IP è l'indirizzo preferito.

ScopeId

Tipo: SCOPE_ID

ID ambito dell'indirizzo IP. Questo membro è applicabile solo a un indirizzo IPv6. Impossibile impostare questo membro. Viene determinato automaticamente dall'interfaccia in cui è stato aggiunto l'indirizzo.

CreationTimeStamp

Tipo: LARGE_INTEGER

Timestamp al momento della creazione dell'indirizzo IP.

Commenti

La struttura MIB_UNICASTIPADDRESS_ROW è definita in Windows Vista e versioni successive.

Il membro SkipAsSource della struttura MIB_UNICASTIPADDRESS_ROW influisce sull'operazione delle funzioni getaddrinfo, GetAddrInfoW e GetAddrInfoEx nei socket di Windows. Se il parametro pNodeName passato alle funzioni getaddrinfo o GetAddrInfoW o il parametro pName passato alla funzione GetAddrInfoEx punta a un nome computer, vengono restituiti tutti gli indirizzi permanenti per il computer che possono essere usati come indirizzo di origine. In Windows Vista e versioni successive, questi indirizzi includono tutti gli indirizzi IP unicast restituiti dalle funzioni GetUnicastIpAddressTable o GetUnicastIpAddressEntry in cui il membro SkipAsSource è impostato su false nella struttura MIB_UNICASTIPADDRESS_ROW .

Se il parametro pNodeName o pName fa riferimento a un nome di server virtuale del cluster, vengono restituiti solo gli indirizzi del server virtuale. In Windows Vista e versioni successive questi indirizzi includono tutti gli indirizzi IP unicast restituiti dalle funzioni GetUnicastIpAddressTable o GetUnicastIpAddressEntry in cui il membro SkipAsSource è impostato su true nella struttura MIB_UNICASTIPADDRESS_ROW . Per altre informazioni sul clustering, vedere Windows Clustering .

Windows 7 con Service Pack 1 (SP1) e Windows Server 2008 R2 con Service Pack 1 (SP1) aggiungono supporto a Netsh.exe per impostare l'attributo SkipAsSource su un indirizzo IP. Questo hotfix modifica anche il comportamento in modo che se il membro SkipAsSource nella struttura MIB_UNICASTIPADDRESS_ROW è impostato su false, l'indirizzo IP verrà registrato in DNS. Se il membro SkipAsSource è impostato su true, l'indirizzo IP non viene registrato in DNS.

Un hotfix è disponibile per Windows 7 e Windows Server 2008 R2 che aggiunge il supporto a Netsh.exe per l'impostazione dell'attributo SkipAsSource in un indirizzo IP. Questo hotfix modifica anche il comportamento in modo che se il membro SkipAsSource nella struttura MIB_UNICASTIPADDRESS_ROW è impostato su false, l'indirizzo IP verrà registrato in DNS. Se il membro SkipAsSource è impostato su true, l'indirizzo IP non viene registrato in DNS. Per altre informazioni, vedere 2386184 della Knowledge Base (KB).

È disponibile anche un hotfix simile per Windows Vista con Service Pack 2 (SP2) e Windows Server 2008 con Service Pack 2 (SP2) che aggiunge il supporto a Netsh.exe per impostare l'attributo SkipAsSource su un indirizzo IP. Questo hotfix modifica anche il comportamento in modo che se il membro SkipAsSource nella struttura MIB_UNICASTIPADDRESS_ROW è impostato su false, l'indirizzo IP verrà registrato in DNS. Se il membro SkipAsSource è impostato su true, l'indirizzo IP non viene registrato in DNS.

Esempio

Nell'esempio seguente viene recuperata una tabella di indirizzi IP unicast e vengono stampati alcuni valori da ognuna delle strutture MIB_UNICASTIPADDRESS_ROW recuperate.


#ifndef UNICODE
#define UNICODE
#endif

#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif

#include <Windows.h.>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <ws2ipdef.h>
#include <iphlpapi.h>
#include <stdio.h>
#include <stdlib.h>

// Need to link with Iphlpapi.lib and Ws2_32.lib
#pragma comment (lib, "iphlpapi.lib")
#pragma comment (lib, "Ws2_32.lib")

int __cdecl wmain()
{

    // Declare and initialize variables

    unsigned int i;

    DWORD Result = 0;

    WCHAR Ipv4String[16] = { 0 };
    WCHAR Ipv6String[46] = { 0 };

    PMIB_UNICASTIPADDRESS_TABLE pipTable = NULL;

    Result = GetUnicastIpAddressTable(AF_UNSPEC, &pipTable);
    if (Result != NO_ERROR) {
        wprintf(L"GetUnicastIpAddressTable returned error: %ld\n", Result);
        exit(1);
    }
    // Print some variables from the rows in the table
    wprintf(L"Number of table entries: %d\n\n", pipTable->NumEntries);

    for (i = 0; i < pipTable->NumEntries; i++) {
        wprintf(L"AddressFamily[%d]:\t\t ", i);

        switch (pipTable->Table[i].Address.si_family) {
        case AF_INET:
            wprintf(L"IPv4\n");
            if (InetNtopW
                (AF_INET, &pipTable->Table[i].Address.Ipv4.sin_addr, Ipv4String,
                 16) != NULL)
                wprintf(L"IPv4 Address:\t\t\t %ws\n", Ipv4String);
            break;
        case AF_INET6:
            wprintf(L"IPv6\n");
            if (InetNtopW
                (AF_INET6, &pipTable->Table[i].Address.Ipv6.sin6_addr,
                 Ipv6String, 46) != NULL)
                wprintf(L"IPv6 Address:\t\t\t %ws\n", Ipv6String);
            break;
        default:
            wprintf(L"Other: %d\n", pipTable->Table[i].Address.si_family);
            break;
        }

        wprintf(L"Interface LUID NetLuidIndex[%d]:  %lu\n",
               i, pipTable->Table[i].InterfaceLuid.Info.NetLuidIndex);
        wprintf(L"Interface LUID IfType[%d]:\t ", i);
        switch (pipTable->Table[i].InterfaceLuid.Info.IfType) {
        case IF_TYPE_OTHER:
            wprintf(L"Other\n");
            break;
        case IF_TYPE_ETHERNET_CSMACD:
            wprintf(L"Ethernet\n");
            break;
        case IF_TYPE_ISO88025_TOKENRING:
            wprintf(L"Token ring\n");
            break;
        case IF_TYPE_PPP:
            wprintf(L"PPP\n");
            break;
        case IF_TYPE_SOFTWARE_LOOPBACK:
            wprintf(L"Software loopback\n");
            break;
        case IF_TYPE_ATM:
            wprintf(L"ATM\n");
            break;
        case IF_TYPE_IEEE80211:
            wprintf(L"802.11 wireless\n");
            break;
        case IF_TYPE_TUNNEL:
            wprintf(L"Tunnel encapsulation\n");
            break;
        case IF_TYPE_IEEE1394:
            wprintf(L"IEEE 1394 (Firewire)\n");
            break;
        default:
            wprintf(L"Unknown: %d\n",
                   pipTable->Table[i].InterfaceLuid.Info.IfType);
            break;
        }

        wprintf(L"Interface Index[%d]:\t\t %lu\n",
               i, pipTable->Table[i].InterfaceIndex);

        wprintf(L"Prefix Origin[%d]:\t\t ", i);
        switch (pipTable->Table[i].PrefixOrigin) {
        case IpPrefixOriginOther:
            wprintf(L"IpPrefixOriginOther\n");
            break;
        case IpPrefixOriginManual:
            wprintf(L"IpPrefixOriginManual\n");
            break;
        case IpPrefixOriginWellKnown:
            wprintf(L"IpPrefixOriginWellKnown\n");
            break;
        case IpPrefixOriginDhcp:
            wprintf(L"IpPrefixOriginDhcp\n");
            break;
        case IpPrefixOriginRouterAdvertisement:
            wprintf(L"IpPrefixOriginRouterAdvertisement\n");
            break;
        case IpPrefixOriginUnchanged:
            wprintf(L"IpPrefixOriginUnchanged\n");
            break;
        default:
            wprintf(L"Unknown: %d\n", pipTable->Table[i].PrefixOrigin);
            break;
        }

        wprintf(L"Suffix Origin[%d]:\t\t ", i);
        switch (pipTable->Table[i].SuffixOrigin) {
        case IpSuffixOriginOther:
            wprintf(L"IpSuffixOriginOther\n");
            break;
        case IpSuffixOriginManual:
            wprintf(L"IpSuffixOriginManual\n");
            break;
        case IpSuffixOriginWellKnown:
            wprintf(L"IpSuffixOriginWellKnown\n");
            break;
        case IpSuffixOriginDhcp:
            wprintf(L"IpSuffixOriginDhcp\n");
            break;
        case IpSuffixOriginLinkLayerAddress:
            wprintf(L"IpSuffixOriginLinkLayerAddress\n");
            break;
        case IpSuffixOriginRandom:
            wprintf(L"IpSuffixOriginRandom\n");
            break;
        case IpSuffixOriginUnchanged:
            wprintf(L"IpSuffixOriginUnchanged\n");
            break;
        default:
            wprintf(L"Unknown: %d\n", pipTable->Table[i].SuffixOrigin);
            break;
        }

        wprintf(L"Valid Lifetime[%d]:\t\t 0x%x (%u)\n", i,
               pipTable->Table[i].ValidLifetime,
               pipTable->Table[i].ValidLifetime);

        wprintf(L"Preferred Lifetime[%d]:\t\t 0x%x (%u)\n", i,
               pipTable->Table[i].PreferredLifetime,
               pipTable->Table[i].PreferredLifetime);

        wprintf(L"OnLink PrefixLength[%d]:\t\t %lu\n", i,
               pipTable->Table[i].OnLinkPrefixLength);

        wprintf(L"Skip As Source[%d]:\t\t ", i);
        if (pipTable->Table[i].SkipAsSource)
            wprintf(L"Yes\n");
        else
            wprintf(L"No\n");

        wprintf(L"Dad State[%d]:\t\t\t ", i);
        switch (pipTable->Table[i].DadState) {
        case IpDadStateInvalid:
            wprintf(L"IpDadStateInvalid\n");
            break;
        case IpDadStateTentative:
            wprintf(L"IpDadStateTentative\n");
            break;
        case IpDadStateDuplicate:
            wprintf(L"IpDadStateDuplicate\n");
            break;
        case IpDadStateDeprecated:
            wprintf(L"IpDadStateDeprecated\n");
            break;
        case IpDadStatePreferred:
            wprintf(L"IpDadStatePreferred\n");
            break;
        default:
            wprintf(L"Unknown: %d\n", pipTable->Table[i].DadState);
            break;
        }

        wprintf(L"\n");
    }

    if (pipTable != NULL) {
        FreeMibTable(pipTable);
        pipTable = NULL;
    }

    exit(0);
}


Requisiti

Requisito Valore
Client minimo supportato Windows Vista [solo app desktop]
Server minimo supportato Windows Server 2008 [solo app desktop]
Intestazione netioapi.h (include Iphlpapi.h)

Vedi anche

CreateUnicastIpAddressEntry

DeleteUnicastIpAddressEntry

GetAddrInfoEx

GetAddrInfoW

GetUnicastIpAddressEntry

GetUnicastIpAddressTable

InitializeUnicastIpAddressEntry

MIB_UNICASTIPADDRESS_TABLE

SOCKADDR_INET

SetUnicastIpAddressEntry

getaddrinfo