在Windows上准备好网络接口的通知

时间:2010-12-28 14:48:54

标签: windows winapi networking

如何在Windows XP下启动网络界面并准备就绪时收到通知?

就绪表示接口已通过DHCP获取网络IP地址,可以随时使用。

2 个答案:

答案 0 :(得分:8)

当界面准备就绪时,你绝对可以获得一个事件!只需使用IPHelper!您要寻找的功能是NotifyAddrChange http://msdn.microsoft.com/en-us/library/aa366329%28v=VS.85%29.aspx,它可以从Windows 2000开始使用。当适配器启动并运行时,它将被分配一个IP地址,从而触发回调。

触发时可以使用GetAdapterAddress来计算所需的信息。在Vista或更高版本上有NotifyIpInterfaceChange直接告诉哪个适配器有IP更改。

答案 1 :(得分:1)

您可以使用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 ##,Were ## ADAPTERNAME ##是IP_ADAPTER_ADDRESSES结构的AdapterName成员。 检查EnableDHCP以查找它是否是动态地址,然后查看DhcpIPAddress密钥。