void CClientList::RemoveClient(CUpDownClient* toremove, LPCTSTR pszReason){ POSITION pos = list.Find(toremove); if (pos){ CGlobalVariable::uploadqueue->RemoveFromUploadQueue(toremove, CString(_T("CClientList::RemoveClient: ")) + pszReason); CGlobalVariable::uploadqueue->RemoveFromWaitingQueue(toremove); CGlobalVariable::downloadqueue->RemoveSource(toremove); #if _ENABLE_NOUSE // Comment UI //SendMessage(CGlobalVariable::m_hListenWnd,WM_FILE_REMOVE_PEER,1,(LPARAM)toremove); UINotify(WM_FILE_REMOVE_PEER,1,(LPARAM)toremove, toremove, true); //theApp.emuledlg->transferwnd->clientlistctrl.RemoveClient(toremove); #endif list.RemoveAt(pos); } RemoveFromKadList(toremove); RemoveConnectingClient(toremove); }
bool CServerList::AddServer(const CServer* pServer) { if (!IsGoodServerIP(pServer)){ // check for 0-IP, localhost and optionally for LAN addresses if (thePrefs.GetLogFilteredIPs()) AddDebugLogLine(false, _T("Filtered server \"%s\" (IP=%s) - Invalid IP or LAN address."), pServer->GetListName(), ipstr(pServer->GetIP())); return false; } if (thePrefs.GetFilterServerByIP()){ // IP-Filter: We don't need to reject dynIP-servers here. After the DN was // resolved, the IP will get filtered and the server will get removed. This applies // for TCP-connections as well as for outgoing UDP-packets because for both protocols // we resolve the DN and filter the received IP. //if (pServer->HasDynIP()) // return false; // Comment UI /*if (CGlobalVariable::ipfilter->IsFiltered(pServer->GetIP())){ if (thePrefs.GetLogFilteredIPs()) AddDebugLogLine(false, _T("Filtered server \"%s\" (IP=%s) - IP filter (%s)"), pServer->GetListName(), ipstr(pServer->GetIP()), CGlobalVariable::ipfilter->GetLastHit()); return false; }*/ } CServer* pFoundServer = GetServerByAddress(pServer->GetAddress(), pServer->GetPort()); // Avoid duplicate (dynIP) servers: If the server which is to be added, is a dynIP-server // but we don't know yet it's DN, we need to search for an already available server with // that IP. if (pFoundServer == NULL && pServer->GetIP() != 0) pFoundServer = GetServerByIPTCP(pServer->GetIP(), pServer->GetPort()); if (pFoundServer){ pFoundServer->ResetFailedCount(); // Comment UI //theApp.emuledlg->serverwnd->serverlistctrl.RefreshServer(pFoundServer); UINotify(WM_SERVER_REFRESH, 0, (LPARAM)pFoundServer, pFoundServer); return false; } list.AddTail(const_cast<CServer*>(pServer)); return true; }
void CClientList::AddClient(CUpDownClient* toadd, bool bSkipDupTest) { #ifdef _DEBUG_PEER Debug( _T("Peer(%d)-(pt:%d) Added into ClientList \n"),toadd->m_iPeerIndex,toadd->m_iPeerType); #endif // skipping the check for duplicate list entries is only to be done for optimization purposes, if the calling // function has ensured that this client instance is not already within the list -> there are never duplicate // client instances in this list. if (!bSkipDupTest){ if(list.Find(toadd)) return; } #if _ENABLE_NOUSE // Comment UI //uint32 struPFilePeer[] = {(uint32)0,(uint32)toadd,(uint32)0}; //SendMessage(CGlobalVariable::m_hListenWnd,WM_FILE_ADD_PEER,1,(LPARAM)toadd); UINotify(WM_FILE_ADD_PEER,1,(LPARAM)toadd, toadd); //theApp.emuledlg->transferwnd->clientlistctrl.AddClient(toadd); #endif list.AddTail(toadd); }
void CServerList::ServerStats() { // Update the server list even if we are connected to Kademlia only. The idea is for both networks to keep // each other up to date.. Kad network can get you back into the ED2K network.. And the ED2K network can get // you back into the Kad network.. // Comment UI if (CGlobalVariable::IsConnected() && CGlobalVariable::serverconnect->IsUDPSocketAvailable() && list.GetCount() > 0) { CServer* ping_server = GetNextStatServer(); if (!ping_server) return; uint32 tNow = (uint32)time(NULL); const CServer* test = ping_server; while (ping_server->GetLastPingedTime() != 0 && (tNow - ping_server->GetLastPingedTime()) < UDPSERVSTATREASKTIME) { ping_server = GetNextStatServer(); if (ping_server == test) return; } // IP-filter: We do not need to IP-filter any servers here, even dynIP-servers are not // needed to get filtered here. See also comments in 'CServerSocket::ConnectTo'. if (ping_server->GetFailedCount() >= thePrefs.GetDeadServerRetries()) { // Comment UI //theApp.emuledlg->serverwnd->serverlistctrl.RemoveServer(ping_server); return; } srand(tNow); ping_server->SetRealLastPingedTime(tNow); // this is not used to calcualte the next ping, but only to ensure a minimum delay for premature pings if (!ping_server->GetCryptPingReplyPending() && (tNow - ping_server->GetLastPingedTime()) >= UDPSERVSTATREASKTIME && CGlobalVariable::GetPublicIP() != 0 && thePrefs.IsServerCryptLayerUDPEnabled()){ // we try a obfsucation ping first and wait 20 seconds for an answer // if it doesn'T get responsed, we don't count it as error but continue with a normal ping ping_server->SetCryptPingReplyPending(true); uint32 nPacketLen = 4 + (uint8)(rand() % 16); // max padding 16 bytes BYTE* pRawPacket = new BYTE[nPacketLen]; uint32 dwChallenge = (rand() << 17) | (rand() << 2) | (rand() & 0x03); if (dwChallenge == 0) dwChallenge++; PokeUInt32(pRawPacket, dwChallenge); for (uint32 i = 4; i < nPacketLen; i++) // fillung up the remaining bytes with random data pRawPacket[i] = (uint8)rand(); ping_server->SetChallenge(dwChallenge); ping_server->SetLastPinged(GetTickCount()); ping_server->SetLastPingedTime((tNow - (uint32)UDPSERVSTATREASKTIME) + 20); // give it 20 seconds to respond if (thePrefs.GetDebugServerUDPLevel() > 0) Debug(_T(">>> Sending OP__GlobServStatReq (obfuscated) to server %s:%u\n"), ping_server->GetAddress(), ping_server->GetPort()); theStats.AddUpDataOverheadServer(nPacketLen); CGlobalVariable::serverconnect->SendUDPPacket(NULL, ping_server, true, ping_server->GetPort() + 12, pRawPacket, nPacketLen); } else if (ping_server->GetCryptPingReplyPending() || CGlobalVariable::GetPublicIP() == 0 || !thePrefs.IsServerCryptLayerUDPEnabled()){ // our obfsucation ping request was not answered, so probably the server doesn'T supports obfuscation // continue with a normal request if (ping_server->GetCryptPingReplyPending() && thePrefs.IsServerCryptLayerUDPEnabled()) DEBUG_ONLY(DebugLog(_T("CryptPing failed for server %s"), ping_server->GetListName())); else if (thePrefs.IsServerCryptLayerUDPEnabled()) DEBUG_ONLY(DebugLog(_T("CryptPing skipped because our public IP is unknown for server %s"), ping_server->GetListName())); ping_server->SetCryptPingReplyPending(false); Packet* packet = new Packet(OP_GLOBSERVSTATREQ, 4); uint32 uChallenge = 0x55AA0000 + GetRandomUInt16(); ping_server->SetChallenge(uChallenge); PokeUInt32(packet->pBuffer, uChallenge); ping_server->SetLastPinged(GetTickCount()); ping_server->SetLastPingedTime(tNow - (rand() % HR2S(1))); ping_server->AddFailedCount(); // Comment UI //theApp.emuledlg->serverwnd->serverlistctrl.RefreshServer(ping_server); UINotify(WM_SERVER_REFRESH, 0, (LPARAM)ping_server, ping_server); if (thePrefs.GetDebugServerUDPLevel() > 0) Debug(_T(">>> Sending OP__GlobServStatReq (not obfuscated) to server %s:%u\n"), ping_server->GetAddress(), ping_server->GetPort()); theStats.AddUpDataOverheadServer(packet->size); CGlobalVariable::serverconnect->SendUDPPacket(packet, ping_server, true); } else ASSERT( false ); } }