none
怎么监控网络?NotifyRouteChange这个怎么是无限监听通知的?求解 RRS feed

  • 问题

  • 禁用网络,会一直跑进红色区域,NotifyRouteChange不是就通知一次吗?求解
    HANDLE CNotifyAddrChange::SetListenRoute(OVERLAPPED& overlap)
    {
    //OVERLAPPED overlap;
    DWORD ret;
    HANDLE handle = NULL;
    HANDLE h2;
    handle = WSACreateEvent();
    overlap.hEvent = handle;

    ret = NotifyRouteChange(&h2, &overlap);

    if (ret != NO_ERROR)
    {
    return handle;
    }
    else
    {
    ::AfxMessageBox(L"监听路由失败");
    return NULL;
    }

    }

    DWORD CNotifyAddrChange::ListenIPThread(LPVOID data)
    {
    HANDLE IPHandle;
    HANDLE RouteHandle;

    if (m_Self)
    {
    CNotifyAddrChange::InitNotifyAddrChange();
    }

    OVERLAPPED overlapIP;
    OVERLAPPED overlapRoute;

    IPHandle=m_Self->SetListenIP(overlapIP);  

    RouteHandle = m_Self->SetListenRoute(overlapRoute);

    HANDLE EventArray[3] = {IPHandle, RouteHandle, m_Self->m_StopThreadEvent};
    while(1)
    {  
    DWORD Ret = WSAWaitForMultipleEvents(3,EventArray,FALSE,INFINITE,TRUE); 
    if( Ret == 0)  
    {  
    //通知网络有变动  

    //做自己要做的事情。。
    LogMsg(TEXT("IP Change!"));
    CancelIPChangeNotify(&overlapIP);
    memset(&overlapIP, 0, sizeof(overlapIP));
    IPHandle=m_Self->SetListenIP(overlapIP);  
    }
    else if (Ret == 1)
    {
    LogMsg(TEXT("Route Change!"));
    CancelIPChangeNotify(&overlapRoute);
    memset(&overlapRoute, 0, sizeof(overlapRoute));
    // RouteHandle = m_Self->SetListenRoute(overlapRoute);
    }
    else if (Ret == 2)
    {
    ::CloseHandle(IPHandle);
    ::CloseHandle(RouteHandle);
    return 0;
    }
    }

    }

    2011年8月25日 6:54

全部回复

  • 大牛进来指导下,想监控网络是否改变
    2011年8月25日 9:36
  • 是不是因为还有其他的通知发送过来,因为你在WSAWaitForMultipleEvents设置的时候,是判断只要有消息发送就可以获得返回值
    2011年8月26日 8:03
  • 是不是因为还有其他的通知发送过来,因为你在WSAWaitForMultipleEvents设置的时候,是判断只要有消息发送就可以获得返回值

    WSAWaitForMultipleEvents这个是监听的路由和IP的事件,MSDN上注释:就通知一次的。但是怎么一直通知呢
    2011年8月31日 6:58
  • 你好,

     

    根据您设置WSAWaitForMultipleEvents中超时参数为无限,也就是您设置的一直监听。如果您需要只监听一次就返回,可以在WSAWaitForMultipleEvents之后调用WSAResetEvent

     

    希望我的建议能够帮助您解决您的问题

     


    Rob Pan [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    • 已标记为答案 Rob Pan 2011年9月5日 8:32
    • 取消答案标记 chenmingshi 2011年9月7日 6:41
    2011年9月1日 8:42
  • 你好,

     

    根据您设置WSAWaitForMultipleEvents中超时参数为无限,也就是您设置的一直监听。如果您需要只监听一次就返回,可以在WSAWaitForMultipleEvents之后调用WSAResetEvent

     

    希望我的建议能够帮助您解决您的问题

     


    Rob Pan [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    怎么可能?要是这样的话那我还监听什么。。。肯定是监听完一次改变, 再监听,等待下一次改变的。监听IP的就不是这样,这个完全没道理呀,一直返回是话意思就是说一直改变呗。。
    2011年9月7日 6:43