zoukankan      html  css  js  c++  java
  • 在完成端口IOCP模型判断客户端是否已关闭连接(掉线)

    判断客户端是否关闭:
       1   GetQueuedCompletionStatus 返回 FALSE,根据错误号判断。
       2   客户端端定时发送(也就是心跳包判断)
    补:GetQueuedCompletionStatus 的返回值为 ERROR_SUCCESS 和lpNumberOfBytes 为0的时,客户端sockt关闭。在测试的时候,连接的客户端发生异常崩溃,强制关闭客户端后,GetQueuedCompletionStatus 的返回值并不为 ERROR_SUCCESS,不过 lpNumberOfBytes 为0。所以判断客户端是否关闭可以只判断 lpNumberOfBytes 的值是否为0。
    DWORD CIocpModeSvr::HeartBeatProc()
    {
    while(1)
    {
       {//Begin of CAutoLock
       CAutoLock autoLock(cInfoSection);
       LPPER_HANDLE_DATA PerHandleData = NULL;
       for(ClientList::iterator iter = m_ClientList.begin(); iter != m_ClientList.end() && m_ClientList.size() >0; iter++)
       {
        PerHandleData = (*iter);
       
        if(PerHandleData->bIsConnect)
        {
         sockaddr_in in;
         in.sin_addr.S_un.S_addr = PerHandleData->IpAddr;
         _Track("+连接:%s,心跳:%d",inet_ntoa(in.sin_addr),PerHandleData->dwHeartBeat);
        }
        if(PerHandleData->dwHeartBeat < 7)//连续三次没收到心跳就XX掉
        {
        // CancelIo((HANDLE) PerHandleData->sClient);
        // closesocket(PerHandleData->sClient);
        }
        else//数据一切正常,心跳计数减一
        {
         (*iter)->dwHeartBeat--;
        }
       }
       }//End of CAutoLock
       Sleep(75 * 1000);//75秒检测一次心跳
    }
    return 0;
    }
    DWORD CIocpModeSvr::HeartBeatProcThread(LPVOID lParam)
    {
    return ((CIocpModeSvr*)lParam)->HeartBeatProc();
    }

  • 相关阅读:
    Nginx负载均衡+代理+ssl+压力测试
    Nginx配置文件详解
    HDU ACM 1690 Bus System (SPFA)
    HDU ACM 1224 Free DIY Tour (SPFA)
    HDU ACM 1869 六度分离(Floyd)
    HDU ACM 2066 一个人的旅行
    HDU ACM 3790 最短路径问题
    HDU ACM 1879 继续畅通工程
    HDU ACM 1856 More is better(并查集)
    HDU ACM 1325 / POJ 1308 Is It A Tree?
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13318537.html
Copyright © 2011-2022 走看看