⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 downloader.cpp

📁 cTorrent advanced 3.3.2。是对 CTorrent 的一个改进版本。这是目前的最新版。
💻 CPP
字号:
#include "def.h"#include <sys/types.h>#include <sys/time.h>#include <time.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <errno.h>#include "peerlist.h"#include "tracker.h"#include "btcontent.h"#include "ctcs.h"#include "btconfig.h"#include "bttime.h"#include "console.h"#define MAX_SLEEP 1time_t now = time((time_t *)0);void Downloader(){  int nfds = 0, maxfd, r;  struct timeval timeout;  fd_set rfd, rfdnext;  fd_set wfd, wfdnext;  int stopped = 0, f_idleused = 0, f_poll = 0;  struct timespec nowspec;  double maxsleep;  time_t then, concheck = (time_t)0;  FD_ZERO(&rfdnext); FD_ZERO(&wfdnext);  do{    time(&now);    if( !stopped ){      if( !Tracker.IsQuitting() && BTCONTENT.SeedTimeout() )        Tracker.SetStoped();      if( Tracker.IsQuitting() && !Tracker.IsRestarting() ){        stopped = 1;        WORLD.Pause();        if( arg_ctcs ) CTCS.Send_Status();      }    }    maxfd = -1;    maxsleep = -1;    rfd = rfdnext;    wfd = wfdnext;    if( f_poll ){      FD_ZERO(&rfd); FD_ZERO(&wfd);  // remove non-peers from sets      maxsleep = 0;  // waited for bandwidth--poll now    }else{      WORLD.DontWaitBW();      if( WORLD.IsIdle() ){        f_idleused = 0;        if( BTCONTENT.CheckedPieces() < BTCONTENT.GetNPieces() &&            !BTCONTENT.NeedFlush() ){          if( BTCONTENT.CheckNextPiece() < 0 ){            CONSOLE.Warning(1, "Error while checking piece %d of %d",              (int)(BTCONTENT.CheckedPieces()), (int)(BTCONTENT.GetNPieces()));            Tracker.SetStoped();            maxsleep = 2;          }else maxsleep = 0;          f_idleused = 1;          time(&now);        }        r = Tracker.IntervalCheck(&rfd, &wfd);        if( r > maxfd ) maxfd = r;        if( arg_ctcs ){          r = CTCS.IntervalCheck(&rfd, &wfd);          if( r > maxfd ) maxfd = r;        }        if( !f_idleused || concheck <= now-2 || WORLD.IsIdle() ){          concheck = now;          r = CONSOLE.IntervalCheck(&rfd, &wfd);          if( r > maxfd ) maxfd = r;        }      }    }    r = WORLD.IntervalCheck(&rfd, &wfd);    if( r > maxfd ) maxfd = r;    if( !f_poll ){      time(&now);      while( BTCONTENT.NeedFlush() && WORLD.IsIdle() ){        BTCONTENT.FlushQueue();        maxsleep = 0;        time(&now);      }    }    rfdnext = rfd;    wfdnext = wfd;    if( maxsleep < 0 ){  //not yet set      maxsleep = WORLD.WaitBW();  // must do after intervalchecks!      if( maxsleep <= -100 ) maxsleep = 0;      else if( maxsleep <= 0 || maxsleep > MAX_SLEEP ) maxsleep = MAX_SLEEP;    }    timeout.tv_sec = (long)maxsleep;    timeout.tv_usec = (long)( (maxsleep-(long)maxsleep) * 1000000 );    WORLD.UnLate();    nfds = select(maxfd + 1,&rfd,&wfd,(fd_set*) 0,&timeout);    if( nfds < 0 ){      CONSOLE.Debug("Error from select:  %s", strerror(errno));      FD_ZERO(&rfdnext); FD_ZERO(&wfdnext);      nfds = 0;    }    if( f_poll ) f_poll = 0;    else if( nfds > 0 ) WORLD.DontWaitBW();    else if( maxsleep > 0 && maxsleep < MAX_SLEEP ) f_poll = 1;    then = now;    time(&now);    if( now == then-1 ) now = then;    if( !f_poll && nfds > 0 ){      if(T_FREE != Tracker.GetStatus())        Tracker.SocketReady(&rfd,&wfd,&nfds,&rfdnext,&wfdnext);      if(nfds > 0 && T_FREE != CTCS.GetStatus())        CTCS.SocketReady(&rfd,&wfd,&nfds,&rfdnext,&wfdnext);      if(nfds > 0)        CONSOLE.User(&rfd,&wfd,&nfds,&rfdnext,&wfdnext);    }    if(nfds > 0)      WORLD.AnyPeerReady(&rfd,&wfd,&nfds,&rfdnext,&wfdnext);  } while(Tracker.GetStatus() != T_FINISHED || Tracker.IsRestarting());}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -