bool CCRefreshClient::Sync(unsigned long nChecksum) { if (OnSync(nChecksum) == true) { SetChecksum(nChecksum); return true; } else { return false; } }
bool CNatThread::ProcessPacket(const BYTE* packet, UINT size, uint32 ip, uint16 port) { uint8 opcode=packet[4]; const uchar * realdata=packet+5; UINT realsize=size-5; CSingleLock locker(&m_Mutex, TRUE); // modiefied by robert, 2010-08-03 // beta版屏蔽try,以求暴露更多问题 #ifndef _BETA try { #endif switch(opcode) { case OP_NAT_REPING: OnReping(ip, port, realdata, realsize); break; case OP_NAT_REGISTER: // VC-SearchDream[2007-06-15]: Add Login Support if (realsize >= 2 && !m_bRegister && ip==m_dwSvrIp && port==m_wSvrPort ) { if (realsize >= 6) { WORD port = *(WORD*)(realdata); DWORD ip = *(DWORD*)(realdata + 2); if (ip != m_dwSvrIp || port != m_wSvrPort) { m_dwSvrIp = ip; m_wSvrPort = port; m_bRegister = false; RegisterMe(m_dwSvrIp,m_wSvrPort); m_dwRegAttemptTimes = 1; m_dwRegNextAttempInterval = INIT_ATTEMPT_INTERVAL*2; break; } } else { WORD port = *(WORD*)(realdata); if (port != m_wSvrPort) { m_wSvrPort = port; m_bRegister = false; RegisterMe(m_dwSvrIp,m_wSvrPort); m_dwRegAttemptTimes = 1; m_dwRegNextAttempInterval = INIT_ATTEMPT_INTERVAL*2; T_TRACE("new server port : %d.", ntohs(port)); break; } } } m_dwSvrRetTime = time(NULL); if(!m_bRegister) { m_bRegister=true; m_dwSvrKeepalive = time(NULL); m_dwRegAttemptTimes = 0; m_dwRegNextAttempInterval = INIT_ATTEMPT_INTERVAL; T_TRACE("reset svr time in register"); AddLogLine(false, _T("Registered to NAT traversal server\n")); } break; case OP_NAT_FAILED: { /* if(realdata[0]==2) { m_bRegister = false; break; } else */if(realdata[0]==1) { realdata++; realsize--; int n=realsize/16; if(ProcessStrategyPacket(realdata, ip, port, packet+4, size-4)) break; for(int i=0; i<n; i++) { TRACE(_T("failed conn request for %s\n"),UserHashToString(realdata)); CUnconnSocket * us= FindUnconnectSocket(realdata); if(us) us->m_dwState |= NAT_E_NOPEER; realdata+=16; } } } break; //case OP_NAT_SYNC2: //if(ProcessStrategyPacket(realdata+6, ip, port, packet+4, size-4)) // break; //OnSync2(ip, port, realdata, realsize); //break; case OP_NAT_SYNC2: case OP_NAT_SYNC: OnSync(ip, port, realdata, realsize); break; case OP_NAT_PING: OnPing(ip, port, realdata, realsize); break; case OP_NAT_DATA: { if(size < 4) // ACK (+ DATA) break; DWORD ConnAck = 0; memcpy(&ConnAck, realdata, 4); realdata += 4; realsize -= 4; CNatSocket* source = FindNatSocket(ip, port, ConnAck); if( source == NULL ) { #ifdef _DEBUG_NAT TRACE("\n*** no nat sock to recv NAT_DATA. connack=%08x\n", ConnAck); #endif uint32 uSequenceNr = PeekUInt32(realdata); if(uSequenceNr==1) { uchar pack[16]; GetMyUserHash(pack); CNatSocket::SendPacket(ip, port, OP_NAT_REPING, pack, 16); } else { CNatSocket::SendPacket(ip, port, OP_NAT_RST, NULL, 0); } break; } if(source->ProcessDataPacket(realdata, realsize)) { //TRACE("source->ProcessDataPacket is OK. tag=%08x. Asyncsock=%08x\n", tag,source->GetParent()); //source->OnReceive(0); source->m_Parent->TriggerEvent(FD_READ); return true; } else { T_TRACE("\nFailed to source->ProcessDataPacket. ConnAck=%08x\n\n", ConnAck); } break; } case OP_NAT_ACK: { DWORD ConnAck = 0; memcpy(&ConnAck, realdata, 4); realdata+=4; realsize-=4; CNatSocket* source = FindNatSocket(ip, port, ConnAck); if( source == NULL ) { #ifdef _DEBUG_NAT TRACE("\nsend RST for no nat sock to do NAT_ACK\n"); #endif CNatSocket::SendPacket(ip, port, OP_NAT_RST,0,0); break; } source->ProcessAckPacket(realdata, realsize); break; } case OP_NAT_RST: { break; } default: TRACE("Unknown command\n"); break; } // modiefied by robert, 2010-08-03 // beta版屏蔽try,以求暴露更多问题 #ifndef _BETA }catch(...) { TRACE("Exception: %s\n", __FUNCTION__); } #endif return true; }