2010-12-28 3 views
6

Windows XP에서 네트워크 인터페이스가 준비되고 준비되면 알림을 어떻게 받습니까?Windows에서 네트워크 인터페이스가 준비되었을 때의 알림

준비은 이미 DHCP를 통해 네트워크 IP 주소를 얻었으며 사용할 준비가되었음을 의미합니다.

+0

1 : 어댑터에 대해 알고 계십니까? 그 이름을 아십니까? 설명이야? –

+0

Q2 : 어떤 이벤트가 기다리고 계십니까? 네트워크 케이블 연결? 시스템 초기화 완료? –

+0

@Lior Kogan, 네트워크 인터페이스가 DHCP를 통해 IP 주소를 얻으려고 대기 중입니다. – unixman83

답변

7

인터페이스가 준비되면 분명히 이벤트를받을 수 있습니다! 그냥 IPHelper를 사용하십시오! 찾으려는 기능은 NotifyAddrChange http://msdn.microsoft.com/en-us/library/aa366329%28v=VS.85%29.aspx이며 Windows 2000부터 사용할 수 있습니다. 어댑터가 실행 중일 때 IP 주소가 지정되고 콜백이 트리거됩니다.

필요한 정보를 얻기 위해 GetAdapterAddress를 트리거 할 때 사용할 수 있습니다. Vista 이상에서는 IP 변경이있는 어댑터를 직접 알려주는 NotifyIpInterfaceChange가 있습니다.

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 ##, ADAPTERNAME ##은 IP_ADAPTER_ADDRESSES 구조체의 AdapterName 멤버입니다. EnableDHCP가 동적 주소인지 확인한 다음 DhcpIPAddress 키를 확인하십시오.

관련 문제