📄 uploadqueue.cpp
字号:
RemoveFromWaitingQueue(pos2,true);
if (!cur_client->socket)
{
if(cur_client->Disconnected(_T("AddClientToQueue - same userhash 1")))
{
delete cur_client;
}
}
}
else
{
// remove both since we dont know who the bad on is
if (thePrefs.GetVerbose())
AddDebugLogLine(false,CString(GetResString(IDS_SAMEUSERHASH)),client->GetUserName(),cur_client->GetUserName(),"Both" );
RemoveFromWaitingQueue(pos2,true);
if (!cur_client->socket)
{
if(cur_client->Disconnected(_T("AddClientToQueue - same userhash 2")))
{
delete cur_client;
}
}
return;
}
}
else if (client->GetIP() == cur_client->GetIP())
{
// same IP, different port, different userhash
cSameIP++;
}
}
if (cSameIP >= 3)
{
// do not accept more than 3 clients from the same IP
if (thePrefs.GetVerbose())
DEBUG_ONLY( AddDebugLogLine(false,_T("%s's (%s) request to enter the queue was rejected, because of too many clients with the same IP"), client->GetUserName(), ipstr(client->GetConnectIP())) );
return;
}
else if (theApp.clientlist->GetClientsFromIP(client->GetIP()) >= 3)
{
if (thePrefs.GetVerbose())
DEBUG_ONLY( AddDebugLogLine(false,_T("%s's (%s) request to enter the queue was rejected, because of too many clients with the same IP (found in TrackedClientsList)"), client->GetUserName(), ipstr(client->GetConnectIP())) );
return;
}
// done
// Add clients server to list.
if (thePrefs.AddServersFromClient() && client->GetServerIP() && client->GetServerPort())
{
CServer* srv = new CServer(client->GetServerPort(), ipstr(client->GetServerIP()));
srv->SetListName(srv->GetAddress());
if (!theApp.emuledlg->serverwnd->serverlistctrl.AddServer(srv, true))
delete srv;
}
// statistic values
CKnownFile* reqfile = theApp.sharedfiles->GetFileByID((uchar*)client->GetUploadFileID());
if (reqfile)
reqfile->statistic.AddRequest();
// TODO find better ways to cap the list
if ((uint32)waitinglist.GetCount() > thePrefs.GetQueueSize())
{
return;
}
if (client->IsDownloading())
{
// he's already downloading and wants probably only another file
if (thePrefs.GetDebugClientTCPLevel() > 0)
DebugSend("OP__AcceptUploadReq", client);
Packet* packet = new Packet(OP_ACCEPTUPLOADREQ,0);
theStats.AddUpDataOverheadFileRequest(packet->size);
client->socket->SendPacket(packet,true);
return;
}
if (waitinglist.IsEmpty() && AcceptNewClient())
{
AddUpNextClient(client);
m_nLastStartUpload = ::GetTickCount();
}
else
{
waitinglist.AddTail(client);
client->SetUploadState(US_ONUPLOADQUEUE);
theApp.emuledlg->transferwnd->queuelistctrl.AddClient(client,true);
theApp.emuledlg->transferwnd->ShowQueueCount(waitinglist.GetCount());
client->SendRankingInfo();
}
}
bool CUploadQueue::RemoveFromUploadQueue(CUpDownClient* client, LPCTSTR pszReason, bool updatewindow, bool earlyabort){
for (POSITION pos = uploadinglist.GetHeadPosition();pos != 0;uploadinglist.GetNext(pos)){
if (client == uploadinglist.GetAt(pos)){
if (updatewindow)
theApp.emuledlg->transferwnd->uploadlistctrl.RemoveClient(uploadinglist.GetAt(pos));
if (thePrefs.GetLogUlDlEvents())
AddDebugLogLine(DLP_VERYLOW, true,_T("---- %s: Removing client from upload list. Reason: %s ----"), client->GetUserName(), pszReason==NULL ? _T("") : pszReason);
uploadinglist.RemoveAt(pos);
theApp.uploadBandwidthThrottler->RemoveFromStandardList(client->socket);
if(client->GetSessionUp() > 0) {
++successfullupcount;
totaluploadtime += client->GetUpStartTimeDelay()/1000;
} else if(earlyabort == false)
++failedupcount;
CKnownFile* requestedFile = theApp.sharedfiles->GetFileByID(client->GetUploadFileID());
if(requestedFile != NULL) {
requestedFile->UpdatePartsInfo();
}
theApp.clientlist->AddTrackClient(client); // Keep track of this client
client->SetUploadState(US_NONE);
client->ClearUploadBlockRequests();
return true;
}
}
return false;
}
uint32 CUploadQueue::GetAverageUpTime(){
if( successfullupcount ){
return totaluploadtime/successfullupcount;
}
return 0;
}
bool CUploadQueue::RemoveFromWaitingQueue(CUpDownClient* client, bool updatewindow){
POSITION pos = waitinglist.Find(client);
if (pos){
RemoveFromWaitingQueue(pos,updatewindow);
if (updatewindow)
theApp.emuledlg->transferwnd->ShowQueueCount(waitinglist.GetCount());
return true;
}
else
return false;
}
void CUploadQueue::RemoveFromWaitingQueue(POSITION pos, bool updatewindow){
CUpDownClient* todelete = waitinglist.GetAt(pos);
waitinglist.RemoveAt(pos);
if (updatewindow)
theApp.emuledlg->transferwnd->queuelistctrl.RemoveClient(todelete);
todelete->SetUploadState(US_NONE);
}
void CUploadQueue::UpdateMaxClientScore()
{
m_imaxscore=0;
for(POSITION pos = waitinglist.GetHeadPosition(); pos != 0; ) {
uint32 score = waitinglist.GetNext(pos)->GetScore(true, false);
if(score > m_imaxscore )
m_imaxscore=score;
}
}
bool CUploadQueue::CheckForTimeOver(CUpDownClient* client){
if (!thePrefs.TransferFullChunks()){
if( client->GetUpStartTimeDelay() > SESSIONMAXTIME){ // Try to keep the clients from downloading for ever
if (thePrefs.GetLogUlDlEvents())
AddDebugLogLine(DLP_LOW, false, _T("%s: Upload session ended due to max time %s."), client->GetUserName(), CastSecondsToHM(SESSIONMAXTIME/1000));
return true;
}
// Cache current client score
const uint32 score = client->GetScore(true, true);
// Check if another client has a bigger score
if (score < GetMaxClientScore() && !m_bRemovedClientByScore) {
if (thePrefs.GetLogUlDlEvents())
AddDebugLogLine(DLP_VERYLOW, false, _T("%s: Upload session ended due to score."), client->GetUserName());
m_bRemovedClientByScore = true; //makes sure only one client gets removed per round, so we the best score can be recalculated after the next has its downloadslot
return true;
}
}
else{
// Allow the client to download a specified amount per session
if( client->GetQueueSessionPayloadUp() > SESSIONMAXTRANS ){
if (thePrefs.GetLogUlDlEvents())
AddDebugLogLine(DLP_DEFAULT, false, _T("%s: Upload session ended due to max transfered amount. %s"), client->GetUserName(), CastItoXBytes(SESSIONMAXTRANS));
return true;
}
}
return false;
}
void CUploadQueue::DeleteAll(){
waitinglist.RemoveAll();
uploadinglist.RemoveAll();
// PENDING: Remove from UploadBandwidthThrottler as well!
}
uint16 CUploadQueue::GetWaitingPosition(CUpDownClient* client)
{
if (!IsOnUploadQueue(client))
return 0;
UINT rank = 1;
uint32 myscore = client->GetScore(false);
for (POSITION pos = waitinglist.GetHeadPosition(); pos != 0; ){
if (waitinglist.GetNext(pos)->GetScore(false) > myscore)
rank++;
}
return rank;
}
VOID CALLBACK CUploadQueue::UploadTimer(HWND hwnd, UINT uMsg,UINT_PTR idEvent,DWORD dwTime)
{
// NOTE: Always handle all type of MFC exceptions in TimerProcs - otherwise we'll get mem leaks
try
{
// Barry - Don't do anything if the app is shutting down - can cause unhandled exceptions
if (!theApp.emuledlg->IsRunning())
return;
// Elandal:ThreadSafeLogging -->
// other threads may have queued up log lines. This prints them.
theApp.HandleDebugLogQueue();
theApp.HandleLogQueue();
// Elandal: ThreadSafeLogging <--
// Send allowed data rate to UploadBandWidthThrottler in a thread safe way
theApp.uploadBandwidthThrottler->SetAllowedDataRate(thePrefs.GetMaxUpload()*1024);
// ZZ:UploadSpeedSense -->
theApp.lastCommonRouteFinder->SetPrefs(thePrefs.IsDynUpEnabled(), theApp.uploadqueue->GetDatarate(), thePrefs.GetMinUpload()*1024, thePrefs.GetMaxUpload()*1024, thePrefs.IsDynUpUseMillisecondPingTolerance(), (thePrefs.GetDynUpPingTolerance() > 100)?((thePrefs.GetDynUpPingTolerance()-100)/100.0f):0, thePrefs.GetDynUpPingToleranceMilliseconds(), thePrefs.GetDynUpGoingUpDivider(), thePrefs.GetDynUpGoingDownDivider(), thePrefs.GetDynUpNumberOfPings(), 20); // PENDING: Hard coded min pLowestPingAllowed
// ZZ:UploadSpeedSense <--
theApp.uploadqueue->Process();
theApp.downloadqueue->Process();
if (thePrefs.ShowOverhead()){
theStats.CompUpDatarateOverhead();
theStats.CompDownDatarateOverhead();
}
counter++;
// one second
if (counter >= 10){
counter=0;
// try to use different time intervals here to not create any disk-IO bottle necks by saving all files at once
theApp.clientcredits->Process(); // 13 minutes
theApp.serverlist->Process(); // 17 minutes
theApp.knownfiles->Process(); // 11 minutes
theApp.friendlist->Process(); // 19 minutes
theApp.clientlist->Process();
theApp.sharedfiles->Process();
Kademlia::CKademlia::process();
if( theApp.serverconnect->IsConnecting() && !theApp.serverconnect->IsSingleConnect() )
theApp.serverconnect->TryAnotherConnectionrequest();
theApp.listensocket->UpdateConnectionsStatus();
if (thePrefs.WatchClipboard4ED2KLinks())
theApp.SearchClipboard();
if (theApp.serverconnect->IsConnecting())
theApp.serverconnect->CheckForTimeout();
// -khaos--+++> Update connection stats...
iupdateconnstats++;
// 2 seconds
if (iupdateconnstats>=2) {
iupdateconnstats=0;
theStats.UpdateConnectionStats((float)theApp.uploadqueue->GetDatarate()/1024, (float)theApp.downloadqueue->GetDatarate()/1024);
}
// <-----khaos-
// display graphs
if (thePrefs.GetTrafficOMeterInterval()>0) {
igraph++;
if (igraph >= (uint32)(thePrefs.GetTrafficOMeterInterval()) ) {
igraph=0;
//theApp.emuledlg->statisticswnd->SetCurrentRate((float)(theApp.uploadqueue->Getavgupload()/theApp.uploadqueue->Getavg())/1024,(float)(theApp.uploadqueue->Getavgdownload()/theApp.uploadqueue->Getavg())/1024);
theApp.emuledlg->statisticswnd->SetCurrentRate((float)(theApp.uploadqueue->GetDatarate())/1024,(float)(theApp.downloadqueue->GetDatarate())/1024);
//theApp.uploadqueue->Zeroavg();
}
}
if (theApp.emuledlg->activewnd == theApp.emuledlg->statisticswnd && theApp.emuledlg->IsWindowVisible() ) {
// display stats
if (thePrefs.GetStatsInterval()>0) {
istats++;
if (istats >= (uint32)(thePrefs.GetStatsInterval()) ) {
istats=0;
theApp.emuledlg->statisticswnd->ShowStatistics();
}
}
}
//save rates every second
theStats.RecordRate();
// mobilemule sockets
theApp.mmserver->Process();
// ZZ:UploadSpeedSense -->
theApp.emuledlg->ShowPing();
bool gotEnoughHosts = theApp.clientlist->GiveClientsForTraceRoute();
if(gotEnoughHosts == false) {
theApp.serverlist->GiveServersForTraceRoute();
}
// ZZ:UploadSpeedSense <--
sec++;
// 5 seconds
if (sec>=5) {
#ifdef _DEBUG
if (thePrefs.m_iDbgHeap > 0 && !AfxCheckMemory())
AfxDebugBreak();
#endif
sec = 0;
theApp.listensocket->Process();
theApp.OnlineSig(); // Added By Bouc7
theApp.emuledlg->ShowTransferRate();
if (!thePrefs.TransferFullChunks())
theApp.uploadqueue->UpdateMaxClientScore();
// update cat-titles with downloadinfos only when needed
if (thePrefs.ShowCatTabInfos() &&
theApp.emuledlg->activewnd == theApp.emuledlg->transferwnd &&
theApp.emuledlg->IsWindowVisible())
theApp.emuledlg->transferwnd->UpdateCatTabTitles(false);
if (thePrefs.IsSchedulerEnabled())
theApp.scheduler->Check();
}
statsave++;
// 60 seconds
if (statsave>=60) {
statsave=0;
if (thePrefs.GetWSIsEnabled())
theApp.webserver->UpdateSessionCount();
theApp.serverconnect->KeepConnectionAlive();
}
_uSaveStatistics++;
if (_uSaveStatistics >= thePrefs.GetStatsSaveInterval())
{
_uSaveStatistics = 0;
thePrefs.SaveStats();
}
}
// need more accuracy here. don't rely on the 'sec' and 'statsave' helpers.
thePerfLog.LogSamples();
}
CATCH_DFLT_EXCEPTIONS(_T("CUploadQueue::UploadTimer"))
}
CUpDownClient* CUploadQueue::GetNextClient(const CUpDownClient* lastclient){
if (waitinglist.IsEmpty())
return 0;
if (!lastclient)
return waitinglist.GetHead();
POSITION pos = waitinglist.Find(const_cast<CUpDownClient*>(lastclient));
if (!pos){
TRACE("Error: CUploadQueue::GetNextClient");
return waitinglist.GetHead();
}
waitinglist.GetNext(pos);
if (!pos)
return NULL;
else
return waitinglist.GetAt(pos);
}
/*void CUploadQueue::FindSourcesForFileById(CUpDownClientPtrList* srclist, const uchar* filehash) {
POSITION pos;
pos = uploadinglist.GetHeadPosition();
while(pos)
{
CUpDownClient *potential = uploadinglist.GetNext(pos);
if(md4cmp(potential->GetUploadFileID(), filehash) == 0)
srclist->AddTail(potential);
}
pos = waitinglist.GetHeadPosition();
while(pos)
{
CUpDownClient *potential = waitinglist.GetNext(pos);
if(md4cmp(potential->GetUploadFileID(), filehash) == 0)
srclist->AddTail(potential);
}
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -