Уведомление о готовности сетевого интерфейса в Windows - PullRequest
7 голосов
/ 28 декабря 2010

Как получить уведомление, когда сетевой интерфейс подключен и готов к работе в Windows XP?

Готов означает, что интерфейс уже получил сетевой IP-адрес через DHCP и готов киспользовать.

Ответы [ 2 ]

8 голосов
/ 07 января 2011

Вы можете определенно получить событие, когда интерфейс готов!Просто используйте IPHelper!Функция, которую вы должны искать, - NotifyAddrChange http://msdn.microsoft.com/en-us/library/aa366329%28v=VS.85%29.aspx, и она доступна, начиная с Windows 2000. Когда адаптер запущен и работает, ему будет назначен IP-адрес, что вызовет обратный вызов.

GetAdapterAddress может использоваться при запуске для определения необходимой вам информации.В Vista или выше есть NotifyIpInterfaceChange, который напрямую сообщает, какой адаптер имеет изменение IP.

1 голос
/ 28 декабря 2010

Вы можете использовать GetAdaptersAddresses для получения статуса всех адаптеров, а затем проверить, работает ли он или нет. Вам придется повторять процесс, пока статус не изменится. Я не знаю ни одного способа получения уведомления.

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;

Также для каждого адаптера вы можете искать его IP-адрес в реестре. Это должно быть в SYSTEM \ CurrentControlSet \ Services \ Tcpip \ Parameters \ Interfaces ## ADAPTERNAME ##, ## ADAPTERNAME ## является членом AdapterName структуры IP_ADAPTER_ADDRESSES. Проверьте EnableDHCP, чтобы определить, является ли он динамическим адресом, а затем посмотрите на ключ DhcpIPAddress.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...