怎样才可以在系统修改/增加/删除了系统的IP地址时,得到通知?
在修改主机名字时,也得到通知?最好是在应用层的技术。
我看了IPHelp API,好像NotifyAddr是可以在IP地址改变时会通知是么?具体是怎样的呢?
主机名字修改时,怎样得到通知呢?

解决方案 »

  1.   

    这里有一个NotifyRouteChange()的例子,用法应该差不多http://www.codeproject.com/internet/IPHelper.asp
      

  2.   

    MSDN里的例子,我的win2000+VC6没有头文件,可能是要装platform sdk#include <winsock2.h>
    #include <windows.h>
    #include <iphlpapi.h>
    #include <stdio.h>void main()
    {
      OVERLAPPED overlap;
      DWORD ret;

      HANDLE hand = WSACreateEvent();
      overlap.hEvent = WSACreateEvent();  ret = NotifyAddrChange(&hand, &overlap);  if (ret != NO_ERROR)
      {
        if (WSAGetLastError() != WSA_IO_PENDING)
        {
          printf("NotifyAddrChange error...%d\n", WSAGetLastError());
          return;
        }
      }  if ( WaitForSingleObject(overlap.hEvent, INFINITE) == WAIT_OBJECT_0 )
        printf("IP Address table changed..\n");
    }
      

  3.   

    再参考code project里NotifyRouteChange的用法HANDLE  h; 
    bool bDone = false; m_hEvents[1] = CreateEvent(NULL, TRUE, FALSE, NULL);
    if (NULL != m_hEvents[1])
    {
        m_OverLapped.hEvent = m_hEvents[1]; 
        while (! bDone)
        {
            m_dwResult = NotifyRouteChange(&h, &m_OverLapped);
            if (ERROR_IO_PENDING != m_dwResult)        
            {
                m_strText.Format("NotifyRouteChange() failed.  Result = %lu\r\n", 
                                  m_dwResult);             
                m_edit1.ReplaceSel(m_strText);
                bDone = true;
            }
            else
            {
              m_dwResult = WaitForMultipleObjects(2, m_hEvents, 
                                                    FALSE, INFINITE);          switch(m_dwResult - WAIT_OBJECT_0)
              {
                case 0:
                  bDone = true;
                  break;
                case 1:
                  m_edit1.ReplaceSel("A change was made to the route table.\r\n"); 
                  break;
              }
            }
        } 
       
        CloseHandle(m_hEvents[1]);
    }CloseHandle(m_hEvents[0]);
      

  4.   

    //use DhcpNotifyConfigChange
    BOOL NotifyIPChange(LPCTSTR lpszAdapterName, int nIndex, LPCTSTR pIPAddress, LPCTSTR pNetMask)
    {
    BOOL bResult = FALSE;
    HINSTANCE hDhcpDll;
    DHCPNOTIFYPROC pDhcpNotifyProc;
    WCHAR wcAdapterName[256];MultiByteToWideChar(CP_ACP, 0, lpszAdapterName, -1, wcAdapterName,256);if((hDhcpDll = LoadLibrary("dhcpcsvc")) == NULL)
    return FALSE;if((pDhcpNotifyProc = (DHCPNOTIFYPROC)GetProcAddress(hDhcpDll, "DhcpNotifyConfigChange")) != NULL)
    if((pDhcpNotifyProc)(NULL, wcAdapterName, TRUE, nIndex, inet_addr(pIPAddress), inet_addr(pNetMask), 0) == ERROR_SUCCESS)
    bResult = TRUE;FreeLibrary(hDhcpDll);
    return bResult;
    }