📄 downloader.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 + -