2010-12-28 14 views
6

Come si riceve una notifica quando viene attivata un'interfaccia di rete, in Windows XP?Notifica di quando un'interfaccia di rete è pronta su Windows

Pronto significa che l'interfaccia ha già ottenuto un indirizzo IP di rete tramite DHCP ed è pronta per l'uso.

+0

Q1: Che cosa ne sai sull'adattatore? Conosci il suo nome? È la descrizione? –

+0

Q2: quale evento stai cercando di aspettare? Connessione via cavo di rete? completamento dell'inizializzazione del sistema? –

+0

@Lior Kogan, in attesa dell'interfaccia di rete per acquisire il proprio indirizzo IP tramite DHCP. – unixman83

risposta

7

È possibile ottenere un evento quando un'interfaccia è pronta! Basta usare IPHelper! La funzione che si sta cercando è NotifyAddrChange http://msdn.microsoft.com/en-us/library/aa366329%28v=VS.85%29.aspx ed è disponibile a partire da Windows 2000. Quando un adattatore è attivo e funzionante, verrà assegnato un indirizzo IP e quindi attivato il callback.

Un indirizzo GetAdapter può essere utilizzato quando attivato per calcolare le informazioni necessarie. Su Vista o sopra c'è NotifyIpInterfaceChange che dice direttamente quale adattatore ha cambiato IP.

1

È possibile utilizzare GetAdaptersAddresses per ricevere lo stato di tutti gli adattatori, quindi controllare se è su o giù. Dovrai ripetere la procedura finché lo stato non cambia. Non sono a conoscenza di alcun modo per ricevere notifiche.

ULONG nFlags  = 0; 
DWORD dwVersion  = ::GetVersion(); 
DWORD dwMajorVersion= (DWORD)(LOBYTE(LOWORD(dwVersion))); 
if (dwMajorVersion>=6) // flag supported in Vista and later 
    nFlags= 0x0100;  // GAA_FLAG_INCLUDE_ALL_INTERFACES*/ 

// during system initialization, GetAdaptersAddresses may return ERROR_BUFFER_OVERFLOW and supply nLen, 
// but in a subsequent call it may return ERROR_BUFFER_OVERFLOW and supply greater nLen ! 
ULONG nLen= sizeof (IP_ADAPTER_ADDRESSES); 
BYTE* pBuf= NULL; 
DWORD nErr= 0 ; 
do 
{ 
    delete[] pBuf; 
    pBuf= new BYTE[nLen]; 
    nErr= ::GetAdaptersAddresses(AF_INET, nFlags, NULL, (IP_ADAPTER_ADDRESSES*&)pBuf, &nLen); 
} 
while (ERROR_BUFFER_OVERFLOW == nErr); 

if (NO_ERROR != nErr) 
{ 
    delete[] pBuf; 
    // report GetAdaptersAddresses failed 
    return false; 
} 

const IP_ADAPTER_ADDRESSES* pAdaptersAddresses= (IP_ADAPTER_ADDRESSES*&)pBuf; 

while (pAdaptersAddresses) // for each adapter 
{ 
    // todo: check if this is your adapter... 
    // pAdaptersAddresses->AdapterName 
    // pAdaptersAddresses->Description 
    // pAdaptersAddresses->FriendlyName 

    const IF_OPER_STATUS& Stat= pAdaptersAddresses->OperStatus; // 1:up, 2:down... 

    pAdaptersAddresses= pAdaptersAddresses->Next; 
} 

delete[] pBuf; 
return false; 

Inoltre, per ciascun adattatore è possibile cercare il suo indirizzo IP nel registro. Sarebbe in SYSTEM \ CurrentControlSet \ Services \ Tcpip \ Parameters \ Interfaces ## ADAPTERNAME ##, Were ## ADAPTERNAME ## è il membro AdapterName della struttura IP_ADAPTER_ADDRESSES. Controllare EnableDHCP per trovare se si tratta di un indirizzo dinamico, quindi controllare la chiave DhcpIPAddress.

Problemi correlati