2010-12-28 15 views
6

Làm cách nào để nhận thông báo khi giao diện mạng được khởi động và sẵn sàng, trong Windows XP?Thông báo khi nào giao diện mạng sẵn sàng trên Windows

Sẵn sàng có nghĩa là giao diện đã nhận được địa chỉ IP mạng qua DHCP và sẵn sàng sử dụng.

+0

Q1: Bạn biết gì về bộ điều hợp? Bạn có biết tên của nó không? Đó là mô tả? –

+0

Q2: Bạn đang chờ đợi sự kiện nào? Kết nối cáp mạng? hoàn thành khởi tạo hệ thống? –

+0

@Lior Kogan, Đang đợi giao diện Mạng để có được địa chỉ IP của nó thông qua DHCP. – unixman83

Trả lời

7

Bạn chắc chắn có thể nhận được sự kiện khi giao diện đã sẵn sàng! Chỉ cần sử dụng IPHelper! Chức năng bạn sẽ tìm kiếm là NotifyAddrChange http://msdn.microsoft.com/en-us/library/aa366329%28v=VS.85%29.aspx và nó có sẵn bắt đầu từ Windows 2000. Khi một adapter được thiết lập và chạy, nó sẽ được gán một địa chỉ IP, và do đó kích hoạt cuộc gọi lại.

Một GetAdapterAddress có thể được sử dụng khi được kích hoạt để tìm thông tin bạn cần. Trên Vista hoặc cao hơn có NotifyIpInterfaceChange trực tiếp cho biết adapter nào có thay đổi IP.

1

Bạn có thể sử dụng GetAdaptersAddresses để nhận trạng thái của tất cả các bộ điều hợp, sau đó kiểm tra xem nó có lên hay xuống. Bạn sẽ phải lặp lại quy trình cho đến khi thay đổi trạng thái. Tôi không biết bất kỳ cách nào để nhận thông báo.

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; 

Ngoài ra, đối với mỗi bộ chuyển đổi bạn có thể tìm kiếm địa chỉ IP trong sổ đăng ký. Đó sẽ là SYSTEM \ CurrentControlSet \ Services \ Tcpip \ Parameters \ Giao diện ## ADAPTERNAME ##, ## ADAPTERNAME ## là thành viên AdapterName của cấu trúc IP_ADAPTER_ADDRESSES. Kiểm tra EnableDHCP để tìm xem đó có phải là địa chỉ động hay không, sau đó xem khóa DhcpIPAddress.

Các vấn đề liên quan