void CTraverseBySourceExchange::SendPacket() { m_bFailed = m_dwState & NAT_E_NOPEER; try { if(!m_bFailed && (m_dwState&NAT_S_SYNC)==0 && time(NULL)-m_SendReqTime > 5) // 5 seconds { // failed to connect if(m_nSendReqCount > 12) { m_dwState|=NAT_E_TIMEOUT; if(m_nSendReqCount>23) Failed(); m_nSendReqCount++; } else { if(m_nSendReqCount==0) _AddLogLine(false, _T("Begin to connect %s."), UserHashToString(m_UserHash)); SendConnectReq(); } } if(m_bFailed) { if(m_Sock)// && pClientSock->client) { //m_Sock->m_bUseNat = false; } if(m_dwState & NAT_E_NOPEER) { _AddLogLine(false, _T("Unconnected NatSock was deleted. server return E_NOPEER. %s."), UserHashToString(m_UserHash)); } else { _AddLogLine(false, _T("Unconnected NatSock was deleted. time out. %s."), UserHashToString(m_UserHash)); } } if(m_dwState & NAT_S_SYNC && time(NULL)-m_SendPingTime >4) { if(m_nPassivePing> 15) { _AddLogLine(false, _T("Passive Unconnected NatSock was deleted. timeout. %s."), UserHashToString(m_UserHash)); Failed(); } else { SendPingPacket(); } } } catch(...) { // the CAsyncSocketEx maybe is deleted Failed(); } }
void CTraverseByBuddy::SendPacket() { try { if(!m_bFailed && (m_dwState&NAT_S_SYNC)==0 && time(NULL)-m_SendReqTime > 10) { // failed to connect if(m_nSendReqCount>60) { m_dwState|=NAT_E_TIMEOUT; if(m_nSendReqCount>70) Failed(); m_nSendReqCount++; } else { SendConnectReq(); SendPingPacket(); } } if(m_bFailed) { if(m_Sock)// && pClientSock->client) { //m_Sock->m_bUseNat = false; } _AddLogLine(false, _T("Unconnected NatSock was deleted. time out. %s."), UserHashToString(m_UserHash)); } } catch(...) { // the CAsyncSocketEx maybe is deleted TRACE("Exception: %s\n", __FUNCTION__); Failed(); } }
void CTraverseBySourceExchange::OnRecvSync(const uchar * data, int /*len*/, DWORD /*ip*/, WORD /*port*/) { TRACE("Receive NAT Sync Request From Source Exchange!\n"); //UINT realsize=len-1;// VC-linhai[2007-08-06]:warning C4189: “realsize” : 局部变量已初始化但不引用 const uchar * realdata=data+1; DWORD cip = *(DWORD*)(realdata); WORD cport = *(WORD*)(realdata+4); if(cip==0 || cport==0) { return; } const uchar * id=realdata+6; DWORD ConnAck = 0; memcpy(&ConnAck, id+16, 4); TRACE("recv sync, ConnAck=%08x\n", ConnAck); #ifdef _DEBUG in_addr addr; addr.s_addr = cip; TRACE("peer addr of %02X%02X%02X%02X = %s:%d\n", id[0], id[1], id[2],id[3], inet_ntoa(addr), ntohs(cport)); #endif uchar myid[16]; GetMyUserHash(myid); if(memcmp(id, myid, 16)==0) { _AddLogLine(false, _T("ERROR: recv myself for traversal")); return; } CAsyncSocketEx * pASock=NULL; CUpDownClient * pClient= CGlobalVariable::clientlist->FindClientByUserHash(id); if(pClient) { pASock = pClient->socket; if(! pASock) { CRuntimeClass * pClassSocket = RUNTIME_CLASS(CClientReqSocket); CClientReqSocket * socket = static_cast<CClientReqSocket*>(pClassSocket->CreateObject()); socket->SetClient(pClient); if (!socket->Create()) { socket->Safe_Delete(); return; } pClient->socket = socket; pASock = socket; } ASSERT(pASock); if(! pASock) { return; } } else { TRACE("\n->%s: Accept a incoming sock for %02X%02X%02X%02X\n", __FUNCTION__, id[0],id[1],id[2],id[3]); pASock = CGlobalVariable::natthread->GetTempASock(id); } m_dwClientIp = cip; m_wClientPort = cport; m_dwState |=NAT_S_SYNC; SendPingPacket(); }