// 检测用户心跳 void PasClient::CheckUserLoop( UserSession &user ) { // 控制通道的链路维护 PccUser &tcpuser = user.GetUser( true ) ; if ( tcpuser.IsOnline() ) { if ( tcpuser.Check( 30, PCC_USER_LOOP ) && user.IsKey(true) ) { char buf[1024] = {0}; sprintf( buf, "SZ N %s\r\n", tcpuser._srv_key.c_str() ) ; SendData( tcpuser._fd, buf, strlen(buf) ) ; tcpuser.Update( PCC_USER_LOOP ) ; OUT_SEND( tcpuser._srv_ip.c_str(), tcpuser._srv_port, tcpuser._username.c_str(), "fd %d, Send TCP NOOP: %s", tcpuser._fd->_fd, buf ) ; } // 如果超时需要处理重连操作 if ( tcpuser.Check( 180, PCC_USER_ACTVIE ) ) { tcpuser.SetOffline() ; user.GetUser(false).SetOffline() ; OUT_ERROR( tcpuser._srv_ip.c_str(), tcpuser._srv_port, tcpuser._username.c_str(), "tcp actvie time timeout") ; } } else if ( ! tcpuser.IsOffline() ) { if ( tcpuser.Check( 120, PCC_USER_LOGIN ) ) { tcpuser.SetOffline() ; OUT_PRINT( tcpuser._srv_ip.c_str(), tcpuser._srv_port, tcpuser._username.c_str(), "connect server tcp timeout") ; } } // 数据通道链路维护 PccUser &udpuser = user.GetUser(false) ; if ( udpuser.IsOnline() ) { if ( udpuser.Check( 30, PCC_USER_LOOP ) && user.IsKey(false) ) { char buf[1024] = {0}; sprintf( buf, "*%s|NOOP|%s#", user.GetSrvId(), udpuser._srv_key.c_str() ) ; SendData( udpuser._fd, buf, strlen(buf) ) ; // _udp_handle.deliver_data( udpuser._fd, udpuser._srv_ip.c_str(), udpuser._srv_port, buf, strlen(buf) ) ; udpuser.Update( PCC_USER_LOOP ) ; OUT_SEND( udpuser._srv_ip.c_str(), udpuser._srv_port, udpuser._username.c_str(), "fd %d, Send UDP NOOP: %s", udpuser._fd->_fd, buf ) ; } // 如果UDP心跳没有应答就直接处理重连了 if ( udpuser.Check(180, PCC_USER_ACTVIE) ) { udpuser.SetOffline() ; OUT_ERROR( udpuser._srv_ip.c_str(), udpuser._srv_port, udpuser._username.c_str(), "udp active time timeout" ) ; tcpuser.SetOffline() ; } } else { if ( udpuser.Check( 120, PCC_USER_LOGIN) ) { udpuser.SetOffline() ; OUT_PRINT( udpuser._srv_ip.c_str(), udpuser._srv_port, udpuser._username.c_str(), "connect server udp timeout") ; tcpuser.SetOffline() ; } } }
// 检测用户状态 void PasClient::CheckUserState( UserSession &user ) { // 如果当前TCP用户不在线 if ( user.IsOffline(true) ) { // 如果当前用户还没有超时就允许重新连接 if ( !user.Check( 30, PCC_USER_LOGIN , true ) ) return ; ConnectServer( user, true ) ; } else if ( user.IsOffline(false) && user.IsOnline(true) ){ // 如果当前TCP用户鉴权码为空也不能登陆数据链路 if ( ! user.IsKey(true) ) return ; if ( ! user.Check( 30, PCC_USER_LOGIN, false ) ) return ; ConnectServer( user, false ) ; } }