如题,,不能用ping的方法,,ping的方法会误报急,,在线等答案,,,

解决方案 »

  1.   


    有个函数 :RasConnectionNotification  可以用来在连接断开的时候得到通知,你试一下。
      

  2.   

    不可以啊,,RasConnectionNotification 好像不是用于Ethernet的啊
      

  3.   

    回复人: xiaohedou(小黑豆) ( ) 信誉:100  2003-09-01 13:33:00  得分:0 
     
     
      先用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地址发生变化。
      
     
      

  4.   

    用GetIfEntry试一试
    返回的结构体中MIB_IFROW(具体的可以查看msdn)
    dwOperStatus 
    Specifies the operational status of the interface. This member can be one of the following values. 
    MIB_IF_OPER_STATUS_NON_OPERATIONAL
    MIB_IF_OPER_STATUS_UNREACHABLE
    MIB_IF_OPER_STATUS_DISCONNECTED
    MIB_IF_OPER_STATUS_CONNECTING
    MIB_IF_OPER_STATUS_CONNECTED
    MIB_IF_OPER_STATUS_OPERATIONAL