除了题目中的问题外,另外我还想知道当该网卡增加了一个IP或者删除了一个IP后,我怎么立即知道?有类似的消息通知吗?

解决方案 »

  1.   

    你可以考虑用sniffer来开发!!!
    你可以到网上找一下它的开发包!!!
      

  2.   

    先用CM_Locate_DevNode得到设备管理树的根结点,然后用CM_Reenumerate_DevNode以这个根结点为参数刷新它就搞定!
    在MSDN里面可以查到这两个函数的用法,相关的知识里面也有。
    #include <cfgmgr32.h>BOOL ScanForHardwareChange()
    {
        DEVINST devInst;
        CONFIGERT status;
        
        //得到设备管理树的根结点
        status = CM_Locate_DevNode(&devInst,NULL,CM_LOCATE_DEVNODE_NARMAL);
        if (status!=CR_SUCCESS)
        {
            printf("CM_Locate_DevNode failed: %x\n",status);
            return FALSE;
        }    //刷新
        status = CM_Reenumerate_DevNode(devInst,0);
        if (status !=CR_SUCCESS)
        {
            printf("CM_Reenumerate_DevNode failed: %x\n",status);
            return FALSE;
        }
        return TRUE;
    }
    直接使用这个函数就可以了。如果电脑上没有安装DDK,也可以通过引用cfgmgr32.dll,里面已经封装了这两个函数。
    我插入和拔出网线时,右下角都有显示: 这个叫windows 的气泡功能!如何一拔掉网线我的程序就可以马上得到通知? NotifyAddrChange的使用方法:  
    在主线程中:
       OVERLAPPED      overLapped;
         DWORD   dwError;
         //HANDLE  handle;
         HANDLE  h2;
         handle=CreateEvent(NULL, // SD
                            false,   // reset type
                            false, // initial state
                            "IPChang.data"    // object name
                            );
         overLapped.hEvent=handle;
         NotifyAddrChange(&h2,&overLapped);     //创建一个子进程来等待消息
         LPSECURITY_ATTRIBUTES lpThreadAttributes = NULL;
         SIZE_T dwStackSize = 0;
         //LPTHREAD_START_ROUTINE lpStartAddress;
         LPVOID lpParameter = (LPVOID)&handle;
         DWORD dwCreationFlags = 0 ;
         DWORD lpThreadId;
         HANDLE  THandle = CreateThread(lpThreadAttributes,               // SD
                                       dwStackSize,                    // initial stack size
                                       WaitForEvent,   //lpStartAddress,thread function
                                       lpParameter,           // thread argument
                                       dwCreationFlags,              // creation option
                                       &lpThreadId                      // thread identifier
                                       );子线程:
    DWORD  WINAPI  WaitForEvent(LPVOID data){
         HANDLE handle;
         DWORD  dwError;
         handle=*(HANDLE*)data;
         int OriDhcpNum,CurDhcpNum;     while(1){           dwError=WaitForSingleObject(handle,1000);
               if( dwError == WAIT_OBJECT_0)
               {
                   //A需要判断是否有新的网络设备启用
                   unsigned long    OutBufLenN;
                   PIP_ADAPTER_INFO  AdaptersInfo;
                   int AdaptersNum;
                   DWORD dret;
                   OutBufLenN=1;
                   AdaptersInfo=(PIP_ADAPTER_INFO)malloc(OutBufLenN);
                   dret=GetAdaptersInfo(AdaptersInfo,&OutBufLenN);
                   AdaptersInfo=(PIP_ADAPTER_INFO)malloc(OutBufLenN);
                   dret=GetAdaptersInfo(AdaptersInfo,&OutBufLenN);
                   ......
                }
           }
    }以上程序在win2000/xp下测试可以检测到是否有新的网卡启用或者网卡的IP地址发生变化。
      

  3.   

    xiaohedou(小黑豆):子线程里面有错误啊。如果我将handle作为参数传给子线程,则子线程的死循环WaitForSingleObject函数根本不等就返回了。如果我将h2作为参数传给子线程那么WaitForSingleObject函数一直在那里等待直到超时,而我在等待过程中拔掉网线它也根本没有反映啊。这个功能究竟怎么用?能不能给一个可以使用的例子?
      

  4.   

    如果一拔掉网线就让我知道吗?好像没好的办法,主要是自发自收PING包。
      

  5.   

    我有一个想法还不太成熟:大体的思路是要用到与网卡的驱动程序交互!用户APP有一个守候线程等待网卡的驱动程序的消息!这个是可以实现的,但你需要对与驱动程序的交互有认识!