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

📄 downloader.cpp

📁 ctorrent源码
💻 CPP
字号:
#include <sys/types.h>

#include <time.h>

#ifdef WINDOWS
#include <winsock2.h>

#else
#include <sys/socket.h>
#include <sys/time.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"

time_t now = (time_t) 0;

void Downloader()                 //此文件只有一个程序:Downloader(),负责客户端与tracker服务器的通信,
{                                 //与peer的数据交换等,函数具体的实现则是通过调用各司其职的其它函数实现的。
  int nfds,maxfd,r;
  struct timeval timeout;
  fd_set rfd;
  fd_set wfd;
  int stopped = 0;

  time(&now);
  do{
    if( !stopped &&
        ( BTCONTENT.SeedTimeout(&now) ||                         //检查做种时间
          (( cfg_exit_zero_peers || Tracker.IsQuitting() ) &&
            !WORLD.TotalPeers()) ) ){
        Tracker.SetStoped();
        stopped = 1;
        if( arg_ctcs ) CTCS.Send_Status();
    }
    
    FD_ZERO(&rfd); FD_ZERO(&wfd);
    maxfd = Tracker.IntervalCheck(&now,&rfd, &wfd);                  //检查与tracker服务器的通信间隔和peer数
    if( arg_ctcs ){
      r = CTCS.IntervalCheck(&now,&rfd, &wfd);
      if( r > maxfd ) maxfd = r;
    }
    r = WORLD.FillFDSET(&now,&rfd,&wfd);                          //根据当前peer状态将它们放入可读或可写文件描述符集中
    if( r > maxfd ) maxfd = r;

    timeout.tv_sec = 2;
    timeout.tv_usec = 0;

    nfds = select(maxfd + 1,&rfd,&wfd,(fd_set*) 0,&timeout);             //系统调用select()监视文件描述符集等待数据
    time(&now);

    if(nfds > 0){
      if(T_FREE != Tracker.GetStatus()) Tracker.SocketReady(&rfd,&wfd,&nfds);        //tracker服务器有数据到达
      if(nfds > 0 && T_FREE != CTCS.GetStatus())
        CTCS.SocketReady(&rfd,&wfd,&nfds);
      if(nfds > 0) WORLD.AnyPeerReady(&rfd,&wfd,&nfds);                      //peer有数据到达
    }    
  } while(Tracker.GetStatus() != T_FINISHED || Tracker.IsPaused());      //与tracker服务器的通信结束了吗?
}

⌨️ 快捷键说明

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