// 检测用户心跳 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::ConnectServer( UserSession &user, bool tcp ) { // 更新最后一次登陆的时间 user.Update( PCC_USER_LOGIN, tcp ) ; PccUser &pccuser = user.GetUser( tcp ) ; // 如果TCP连接 if ( tcp ) { pccuser._fd = _tcp_handle.connect_nonb( pccuser._srv_ip.c_str(), pccuser._srv_port, 10 ) ; if ( pccuser._fd > 0 ) { pccuser.SetWaitResp() ; } } /**else { // 数据通道 pccuser._fd = _udp_handle.connect_nonb( pccuser._srv_ip.c_str(), pccuser._srv_port, 10 ) ; if ( pccuser._fd == -1 ) return ; pccuser.SetWaitResp() ; }*/ PccUser &udpuser = user.GetUser( false ) ; udpuser.SetOffline() ; if(udpuser._fd != NULL) { CloseSocket(udpuser._fd); udpuser._fd = NULL; } // 通过TCP通道发送注册数据通道信息 if ( ! tcp ) { PccUser &tcpuser = user.GetUser(true) ; char buf[1024] = {0}; sprintf( buf, "SZ P %s|%s|%d\r\n", user.GetKey(true), _ip.c_str(), _port ) ; // 发送数据通道连接请求 SendData( tcpuser._fd, buf, strlen(buf) ) ; //OUT_SEND( pccuser._srv_ip.c_str(), pccuser._srv_port, pccuser._username.c_str(), "fd %d, Tcp fd %d Send %s", // pccuser._fd->_fd, tcpuser._fd->_fd, buf ) ; } }