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

📄 downloader.cpp

📁 最新的enhanced ctorrent源码
💻 CPP
字号:
#include <sys/types.h>#include <sys/time.h>#include <time.h>#ifdef WINDOWS#include <Winsock2.h>#else#include <stdio.h>   // autoconf manual: Darwin + others prereq for stdlib.h#include <stdlib.h>  // autoconf manual: Darwin prereq for sys/socket.h#include <sys/socket.h>#include <unistd.h>#include <netinet/in.h>#include <arpa/inet.h>#endif#include <stdio.h>#include <stdlib.h>#include <string.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_t) 0;void Downloader(){  int nfds = 0, prevnfds = 0, maxfd, r;  struct timeval timeout;  fd_set rfd, rfdnext;  fd_set wfd, wfdnext;  int stopped = 0;  struct timespec nowspec;  double maxsleep, prevsleep = 0;  FD_ZERO(&rfdnext); FD_ZERO(&wfdnext);  time(&now);  do{    if( !stopped ){      if( !Tracker.IsQuitting() && BTCONTENT.SeedTimeout() )        Tracker.SetStoped();      if( Tracker.IsQuitting() ){        stopped = 1;        if( arg_ctcs ) CTCS.Send_Status();      }    }    prevsleep = maxsleep;    maxsleep = -1;    rfd = rfdnext;    wfd = wfdnext;    if( 0==prevnfds && prevsleep > 0 && prevsleep < MAX_SLEEP ){      FD_ZERO(&rfd); FD_ZERO(&wfd);      maxsleep = 0;  // waited for bandwidth--poll now    }    else if( WORLD.IsIdle() ){      if( BTCONTENT.CheckedPieces() < BTCONTENT.GetNPieces() ){        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;      }      maxfd = Tracker.IntervalCheck(&rfd, &wfd);      if( arg_ctcs ){        r = CTCS.IntervalCheck(&rfd, &wfd);        if( r > maxfd ) maxfd = r;      }      r = CONSOLE.IntervalCheck(&rfd, &wfd);      if( r > maxfd ) maxfd = r;    }    r = WORLD.FillFDSET(&rfd, &wfd);    if( r > maxfd ) maxfd = r;    rfdnext = rfd;    wfdnext = wfd;   again:    if( maxsleep < 0 ){      maxsleep = WORLD.WaitBW();  // must do after intervalchecks/fillfdset!      if( maxsleep <= 0 || maxsleep > MAX_SLEEP ) maxsleep = MAX_SLEEP;    }    timeout.tv_sec = (long)maxsleep;    timeout.tv_usec = (long)( (maxsleep-(long)maxsleep) * 1000000 );    if( maxfd < 0 ) maxfd = 0;    nfds = select(maxfd + 1,&rfd,&wfd,(fd_set*) 0,&timeout);    if( nfds > 0 && maxsleep > 0 ) WORLD.DontWaitBW();    else if( 0==nfds && 0==maxsleep && prevsleep > 0 ){      prevsleep = maxsleep;      maxsleep = -1;      goto again;    }    time(&now);    prevnfds = nfds;    if( (maxsleep > 0 || 0==prevsleep) && 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.IsPaused());}

⌨️ 快捷键说明

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