亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? torrent.c

?? linux下BT軟件的源碼。源代碼可以使用命令“make”進(jìn)行編譯
?? C
字號(hào):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <time.h>
#include <fcntl.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <sys/time.h>
#include <sys/socket.h>
#include <sys/select.h>
#include <netdb.h>
#include <errno.h>
#include "torrent.h"
#include "message.h"
#include "tracker.h"
#include "peer.h"
#include "policy.h"
#include "data.h"
#include "bitfield.h"
#include "parse_metafile.h"

// 接收緩沖區(qū)中的數(shù)據(jù)達(dá)到threshold時(shí),需要立即進(jìn)行處理,否則緩沖區(qū)可能會(huì)溢出
// 18*1024即18K是接收緩沖區(qū)的大小,1500是以太網(wǎng)等局域網(wǎng)一個(gè)數(shù)據(jù)包的最大長(zhǎng)度
#define  threshold (18*1024-1500)

extern Announce_list *announce_list_head;
extern char          *file_name;
extern long long     file_length;
extern int           piece_length;
extern char          *pieces;
extern int           pieces_length;
extern Peer          *peer_head;

extern long long     total_down,total_up;
extern float         total_down_rate,total_up_rate;
extern int           total_peers;
extern int           download_piece_num;
extern Peer_addr     *peer_addr_head;

int                  *sock    = NULL;
struct sockaddr_in   *tracker = NULL;
int                  *valid   = NULL;
int                  tracker_count  = 0;

int                  response_len   = 0;
int                  response_index = 0;
char                 *tracker_response = NULL;

int                  *peer_sock  = NULL;
struct sockaddr_in   *peer_addr  = NULL;
int                  *peer_valid = NULL;
int                  peer_count  = 0;

// 負(fù)責(zé)與所有Peer收發(fā)數(shù)據(jù)、交換消息
int download_upload_with_peers()
{
	Peer            *p;
	int             ret, max_sockfd, i;

	int             connect_tracker, connecting_tracker;
	int             connect_peer, connecting_peer;
	time_t          last_time[3], now_time;

	time_t          start_connect_tracker;  // 開(kāi)始連接tracker的時(shí)間
	time_t          start_connect_peer;     // 開(kāi)始連接peer的時(shí)間
	fd_set          rset, wset;  // select要監(jiān)視的描述符集合
	struct timeval  tmval;       // select函數(shù)的超時(shí)時(shí)間

	
	now_time     = time(NULL);
	last_time[0] = now_time;   // 上一次選擇非阻塞peer的時(shí)間
	last_time[1] = now_time;   // 上一次選擇優(yōu)化非阻塞peer的時(shí)間
	last_time[2] = now_time;   // 上一次連接tracker服務(wù)器的時(shí)間
	connect_tracker    = 1;    // 是否需要連接tracker
	connecting_tracker = 0;    // 是否正在連接tracker
	connect_peer       = 0;    // 是否需要連接peer 
	connecting_peer    = 0;    // 是否正在連接peer

	for(;;) {
		max_sockfd = 0;
		now_time = time(NULL);
		
		// 每隔10秒重新選擇非阻塞peer
		if(now_time-last_time[0] >= 10) {
			if(download_piece_num > 0 && peer_head != NULL) {
				compute_rate();         // 計(jì)算各個(gè)peer的下載、上傳速度
				select_unchoke_peer();  // 選擇非阻塞的peer
				last_time[0] = now_time;
			}
		}
		
		// 每隔30秒重新選擇優(yōu)化非阻塞peer
		if(now_time-last_time[1] >= 30) {
			if(download_piece_num > 0 && peer_head != NULL) {
				select_optunchoke_peer();
				last_time[1] = now_time;
			}
		}
		
		// 每隔5分鐘連接一次tracker,如果當(dāng)前peer數(shù)為0也連接tracker
		if((now_time-last_time[2] >= 300 || connect_tracker == 1) && 
			connecting_tracker != 1 && connect_peer != 1 && connecting_peer != 1) {
			// 由tracker的URL獲取tracker的IP地址和端口號(hào)
			ret = prepare_connect_tracker(&max_sockfd);
			if(ret < 0)  { printf("prepare_connect_tracker\n"); return -1; }

			connect_tracker       = 0;
			connecting_tracker    = 1;
			start_connect_tracker = now_time;
		}
		
		// 如果要連接新的peer
		if(connect_peer == 1) {
			// 創(chuàng)建套接字,向peer發(fā)出連接請(qǐng)求
			ret = prepare_connect_peer(&max_sockfd);
			if(ret < 0)  { printf("prepare_connect_peer\n"); return -1; }

			connect_peer       = 0;
			connecting_peer    = 1;
			start_connect_peer = now_time;
		}

		FD_ZERO(&rset);
		FD_ZERO(&wset);

		// 將連接tracker的socket加入到待監(jiān)視的集合中
		if(connecting_tracker == 1) {
			int flag = 1;
			// 如果連接tracker超過(guò)10秒,則終止連接tracker
			if(now_time-start_connect_tracker > 10) {
				for(i = 0; i < tracker_count; i++)
					if(valid[i] != 0)  close(sock[i]);
			} else {
				for(i = 0; i < tracker_count; i++) {
					if(valid[i] != 0 && sock[i] > max_sockfd)
						max_sockfd = sock[i];  // valid[i]值為-1、1、2時(shí)要監(jiān)視
					if(valid[i] == -1) { 
						FD_SET(sock[i],&rset); 
						FD_SET(sock[i],&wset);
						if(flag == 1)  flag = 0;
					} else if(valid[i] == 1) {
						FD_SET(sock[i],&wset);
						if(flag == 1)  flag = 0;
					} else if(valid[i] == 2) {
						FD_SET(sock[i],&rset);
						if(flag == 1)  flag = 0;
					}
				}
			}
			// 說(shuō)明連接tracker結(jié)束,開(kāi)始與peer建立連接
			if(flag == 1) {
				connecting_tracker = 0;
				last_time[2] = now_time;
				clear_connect_tracker();
				clear_tracker_response();
				if(peer_addr_head != NULL) { 
					connect_tracker = 0;
					connect_peer    = 1;
				} else { 
					connect_tracker = 1;
				}
				continue;
			}
		}

		// 將正在連接peer的socket加入到待監(jiān)視的集合中
		if(connecting_peer == 1) {
			int flag = 1;
			// 如果連接peer超過(guò)10秒,則終止連接peer		
			if(now_time-start_connect_peer > 10) {
				for(i = 0; i < peer_count; i++) {
					if(peer_valid[i] != 1) close(peer_sock[i]);  //不為1說(shuō)明連接失敗
				}
			} else {
				for(i = 0; i < peer_count; i++) {
					if(peer_valid[i] == -1) {
						if(peer_sock[i] > max_sockfd)
							max_sockfd = peer_sock[i];
						FD_SET(peer_sock[i],&rset); 
						FD_SET(peer_sock[i],&wset);
						if(flag == 1)  flag = 0;
					}
				}
			}

			if(flag == 1) {
				connecting_peer = 0;
				clear_connect_peer();
				if(peer_head == NULL)  connect_tracker = 1; 
				continue;
			}
		}

		// 將peer的socket成員加入到待監(jiān)視的集合中
		connect_tracker = 1;
		p = peer_head;
		while(p != NULL) {
			if(p->state != CLOSING && p->socket > 0) {
				FD_SET(p->socket,&rset); 
				FD_SET(p->socket,&wset); 
				if(p->socket > max_sockfd)  max_sockfd = p->socket; 
				connect_tracker = 0;
			}
			p = p->next;
		}
		if(peer_head==NULL && (connecting_tracker==1 || connecting_peer==1)) 
			connect_tracker = 0;
		if(connect_tracker == 1)  continue;

		tmval.tv_sec  = 2;
		tmval.tv_usec = 0;
		ret = select(max_sockfd+1,&rset,&wset,NULL,&tmval);
		if(ret < 0)  { 
			printf("%s:%d  error\n",__FILE__,__LINE__);
			perror("select error"); 
			break;
		}
		if(ret == 0)  continue;

		// 添加have消息,have消息要發(fā)送給每一個(gè)peer,放在此處是為了方便處理
		prepare_send_have_msg();

		// 對(duì)于每個(gè)peer,接收或發(fā)送消息,接收一條完整的消息就進(jìn)行處理
		p = peer_head;
		while(p != NULL) {
			if( p->state != CLOSING && FD_ISSET(p->socket,&rset) ) {
				ret = recv(p->socket,p->in_buff+p->buff_len,MSG_SIZE-p->buff_len,0);
				if(ret <= 0) {  // recv返回0說(shuō)明對(duì)方關(guān)閉連接,返回負(fù)數(shù)說(shuō)明出錯(cuò)
					//if(ret < 0)  perror("recv error"); 
					p->state = CLOSING; 
					// 通過(guò)設(shè)置套接字選項(xiàng)來(lái)丟棄發(fā)送緩沖區(qū)中的數(shù)據(jù)
					discard_send_buffer(p);
					clear_btcache_before_peer_close(p);
					close(p->socket); 
				} else {
					int completed, ok_len;
					p->buff_len += ret;
					completed = is_complete_message(p->in_buff,p->buff_len,&ok_len);
					if (completed == 1)  parse_response(p);
					else if(p->buff_len >= threshold) {
						parse_response_uncomplete_msg(p,ok_len);
					} else {
						p->start_timestamp = time(NULL);
					}
				}
			}
			if( p->state != CLOSING && FD_ISSET(p->socket,&wset) ) {
				if( p->msg_copy_len == 0) {
					// 創(chuàng)建待發(fā)送的消息,并把生成的消息拷貝到發(fā)送緩沖區(qū)并發(fā)送
					create_response_message(p);
					if(p->msg_len > 0) {
						memcpy(p->out_msg_copy,p->out_msg,p->msg_len);
						p->msg_copy_len = p->msg_len;
						p->msg_len = 0; // 消息長(zhǎng)度賦0,使p->out_msg所存消息清空
					}	
				}		
				if(p->msg_copy_len > 1024) {
					send(p->socket,p->out_msg_copy+p->msg_copy_index,1024,0);
					p->msg_copy_len   = p->msg_copy_len - 1024;
					p->msg_copy_index = p->msg_copy_index + 1024;
					p->recet_timestamp = time(NULL); // 記錄最近一次發(fā)送消息給peer的時(shí)間
				}
				else if(p->msg_copy_len <= 1024 && p->msg_copy_len > 0 ) {
					send(p->socket,p->out_msg_copy+p->msg_copy_index,p->msg_copy_len,0);
					p->msg_copy_len   = 0;
					p->msg_copy_index = 0;
					p->recet_timestamp = time(NULL); // 記錄最近一次發(fā)送消息給peer的時(shí)間
				}
			}
			p = p->next;
		}

		if(connecting_tracker == 1) {
			for(i = 0; i < tracker_count; i++) {
				if(valid[i] == -1) {
					// 如果某個(gè)套接字可寫且未發(fā)生錯(cuò)誤,說(shuō)明連接建立成功
					if(FD_ISSET(sock[i],&wset)) {
						int error, len;
						error = 0;
						len = sizeof(error);
						if(getsockopt(sock[i],SOL_SOCKET,SO_ERROR,&error,&len) < 0) {
							valid[i] = 0; 
							close(sock[i]);
						}
						if(error) { valid[i] = 0; close(sock[i]); } 
						else { valid[i] = 1; }
					}
				}
				if(valid[i] == 1 && FD_ISSET(sock[i],&wset) ) {
					char  request[1024];
					unsigned short listen_port = 33550; // 本程序并未實(shí)現(xiàn)監(jiān)聽(tīng)某端口
					unsigned long  down = total_down;
					unsigned long  up = total_up;
					unsigned long  left;
					left = (pieces_length/20-download_piece_num)*piece_length;
					
					int num = i;
					Announce_list *anouce = announce_list_head;
					while(num > 0) {
						anouce = anouce->next;
						num--;
					}
					create_request(request,1024,anouce,listen_port,down,up,left,200);
					write(sock[i], request, strlen(request));
					valid[i] = 2;
				}
				if(valid[i] == 2 && FD_ISSET(sock[i],&rset)) {
					char  buffer[2048];
					char  redirection[128];
					ret = read(sock[i], buffer, sizeof(buffer));
					if(ret > 0)  {
						if(response_len != 0) {
							memcpy(tracker_response+response_index,buffer,ret);
							response_index += ret;
							if(response_index == response_len) {
								parse_tracker_response2(tracker_response,response_len);
								clear_tracker_response();
								valid[i] = 0;
								close(sock[i]);
								last_time[2] = time(NULL);
							}
						} else if(get_response_type(buffer,ret,&response_len) == 1) {
							tracker_response = (char *)malloc(response_len);
							if(tracker_response == NULL) printf("malloc error\n");
							memcpy(tracker_response,buffer,ret);
							response_index = ret;
						} else {
							ret = parse_tracker_response1(buffer,ret,redirection,128);
							if(ret == 1) add_an_announce(redirection);
							valid[i] = 0;
							close(sock[i]);
							last_time[2] = time(NULL);
						}
					}
				} 
			}
		}

		if(connecting_peer == 1) {
			for(i = 0; i < peer_count; i++) {
				if(peer_valid[i] == -1 && FD_ISSET(peer_sock[i],&wset)) {
					int error, len;
					error = 0;
					len = sizeof(error);
					if(getsockopt(peer_sock[i],SOL_SOCKET,SO_ERROR,&error,&len) < 0) {
						peer_valid[i] = 0;
					}
					if(error == 0) {
						peer_valid[i] = 1;
						add_peer_node_to_peerlist(&peer_sock[i],peer_addr[i]);
					}
				} // end if
			} // end for
		} // end if
		
		// 對(duì)處于CLOSING狀態(tài)的peer,將其從peer隊(duì)列中刪除
		// 此處應(yīng)當(dāng)非常小心,處理不當(dāng)非常容易使程序崩潰
		p = peer_head;
		while(p != NULL) {
			if(p->state == CLOSING) {
				del_peer_node(p); 
				p = peer_head;
			} else {
				p = p->next;
			}
		}

		// 判斷是否已經(jīng)下載完畢
		if(download_piece_num == pieces_length/20) { 
			printf("++++++ All Files Downloaded Successfully +++++\n"); 
			break;
		}
	}

	return 0;
}

void print_process_info()
{
	char  info[256];
	float down_rate, up_rate, percent;
	
	down_rate = total_down_rate;
	up_rate   = total_up_rate;
	percent   = (float)download_piece_num / (pieces_length/20) * 100;
	if(down_rate >= 1024)  down_rate /= 1024;
	if(up_rate >= 1024)    up_rate   /= 1024;
	
	if(total_down_rate >= 1024 && total_up_rate >= 1024)
		sprintf(info,"Complete:%.2f%% Peers:%d Down:%.2fKB/s Up:%.2fKB/s \n",
				percent,total_peers,down_rate,up_rate);
	else if(total_down_rate >= 1024 && total_up_rate < 1024)
		sprintf(info,"Complete:%.2f%% Peers:%d Down:%.2fKB/s Up:%.2fB/s \n",
				percent,total_peers,down_rate,up_rate);
	else if(total_down_rate < 1024 && total_up_rate >= 1024)
		sprintf(info,"Complete:%.2f%% Peers:%d Down:%.2fB/s Up:%.2fKB/s \n",
				percent,total_peers,down_rate,up_rate);
	else if(total_down_rate < 1024 && total_up_rate < 1024)
		sprintf(info,"Complete:%.2f%% Peers:%d Down:%.2fB/s Up:%.2fB/s \n",
				percent,total_peers,down_rate,up_rate);
	
	//if(total_down_rate<1 && total_up_rate<1)  return;
	printf("%s",info);
}

int print_peer_list()
{
	Peer *p = peer_head;
	int  count = 0;
	
	while(p != NULL) {
		count++;
		printf("IP:%-16s Port:%-6d Socket:%-4d\n",p->ip,p->port,p->socket);
		p = p->next;
	}
	
	return count;
}

void release_memory_in_torrent()
{
	if(sock    != NULL)  { free(sock);    sock = NULL; }
	if(tracker != NULL)  { free(tracker); tracker = NULL; }
	if(valid   != NULL)  { free(valid);   valid = NULL; }

	if(peer_sock  != NULL)  { free(peer_sock);  peer_sock  = NULL; }
	if(peer_addr  != NULL)  { free(peer_addr);  peer_addr  = NULL; }
	if(peer_valid != NULL)  { free(peer_valid); peer_valid = NULL; }
	free_peer_addr_head();
}

void clear_connect_tracker()
{
	if(sock    != NULL)  { free(sock);    sock    = NULL; }
	if(tracker != NULL)  { free(tracker); tracker = NULL; }
	if(valid   != NULL)  { free(valid);   valid   = NULL; }
	tracker_count = 0;
}

void clear_connect_peer()
{
	if(peer_sock  != NULL) { free(peer_sock);  peer_sock  = NULL; }
	if(peer_addr  != NULL) { free(peer_addr);  peer_addr  = NULL; }
	if(peer_valid != NULL) { free(peer_valid); peer_valid = NULL; }
	peer_count = 0;
}

void clear_tracker_response()
{
	if(tracker_response != NULL) { 
		free(tracker_response);
		tracker_response = NULL;
	}
	response_len   = 0;
	response_index = 0;
}

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91丝袜高跟美女视频| 欧美性大战久久久久久久蜜臀| 国产精品久久久久国产精品日日| 在线免费视频一区二区| 国产一区二区成人久久免费影院| 有码一区二区三区| 久久精品亚洲精品国产欧美 | 欧美国产一区视频在线观看| 欧美日韩不卡一区| 成人av免费在线播放| 看电视剧不卡顿的网站| 亚洲自拍偷拍九九九| 国产偷v国产偷v亚洲高清| 91精品国产福利在线观看 | 日本电影欧美片| 国产成人综合亚洲91猫咪| 天天影视网天天综合色在线播放 | 香港成人在线视频| 国产精品乱码一区二区三区软件| 3atv一区二区三区| 欧美亚洲综合另类| 91麻豆免费看片| 粗大黑人巨茎大战欧美成人| 六月丁香综合在线视频| 午夜亚洲国产au精品一区二区| 亚洲美女视频在线| 国产精品久线观看视频| 精品国产91亚洲一区二区三区婷婷| 欧美日韩电影在线播放| 欧美性猛片xxxx免费看久爱| 91首页免费视频| 99视频国产精品| 成人av资源在线观看| 国产成人av资源| 国产精品一区一区| 国产精品综合二区| 黄一区二区三区| 韩国在线一区二区| 极品少妇xxxx精品少妇| 理论电影国产精品| 久久精品国产秦先生| 麻豆成人久久精品二区三区小说| 亚洲电影一区二区| 午夜欧美电影在线观看| 亚洲一二三四久久| 午夜精品福利一区二区三区av| 亚洲一区在线看| 亚洲不卡在线观看| 日韩电影在线一区二区三区| 日韩黄色在线观看| 麻豆精品一区二区综合av| 美国三级日本三级久久99| 麻豆成人av在线| 国产尤物一区二区| 成人精品视频一区| 91免费观看视频| 欧美视频完全免费看| 欧美片在线播放| 日韩免费福利电影在线观看| 欧美精品一区二区久久久| 国产日韩一级二级三级| 国产精品入口麻豆九色| 亚洲精品国产精华液| 午夜成人免费电影| 韩国v欧美v日本v亚洲v| 成人高清免费观看| 欧美唯美清纯偷拍| 欧美一区二区二区| 一区二区欧美精品| 亚洲一区二区三区四区在线| 日韩国产欧美视频| 国产麻豆精品95视频| av在线不卡电影| 欧美精品一二三| 国产欧美精品一区| 一区二区三区日韩精品| 捆绑变态av一区二区三区| 成人午夜av在线| 欧美日韩一区小说| 久久嫩草精品久久久久| 亚洲欧美另类综合偷拍| 日本视频一区二区| caoporen国产精品视频| 91.com在线观看| 国产女同性恋一区二区| 亚洲国产色一区| 国产a区久久久| 欧美日韩极品在线观看一区| 久久久激情视频| 亚洲午夜一区二区| 国产一区二区三区四区五区入口 | 国产精品 日产精品 欧美精品| 色综合久久综合网| 久久久久久久免费视频了| 亚洲高清在线视频| 国产成人久久精品77777最新版本 国产成人鲁色资源国产91色综 | 99国产精品国产精品久久| 欧美一区国产二区| 中文字幕一区二区不卡| 韩国精品久久久| 欧美人妇做爰xxxⅹ性高电影| 欧美激情一区二区| 免费成人美女在线观看.| 一本一本大道香蕉久在线精品| 天天色综合成人网| 国产v日产∨综合v精品视频| 3d动漫精品啪啪| 亚洲在线成人精品| youjizz国产精品| 久久噜噜亚洲综合| 热久久国产精品| 欧美偷拍一区二区| 亚洲人午夜精品天堂一二香蕉| 国产中文字幕一区| 欧美一区二区三区在线| 洋洋成人永久网站入口| 床上的激情91.| 久久久久亚洲蜜桃| 另类中文字幕网| 日韩欧美一区在线观看| 亚洲国产中文字幕在线视频综合| 97se狠狠狠综合亚洲狠狠| 日本一区二区三区国色天香| 国模一区二区三区白浆| 欧美成人一区二区三区片免费| 亚洲成av人综合在线观看| 在线视频中文字幕一区二区| 日韩毛片一二三区| 成人h动漫精品一区二区| 欧美激情一区二区三区| 国产在线精品国自产拍免费| 欧美刺激午夜性久久久久久久| 亚洲国产精品精华液网站| 欧美视频在线一区| 亚洲自拍偷拍av| 欧美日韩一级视频| 亚洲成人免费在线观看| 欧美精品在线一区二区| 三级不卡在线观看| 日韩一卡二卡三卡| 青青草一区二区三区| 日韩免费高清视频| 韩国v欧美v亚洲v日本v| 久久久久国产免费免费 | 成人永久aaa| 国产精品久久久久久久蜜臀 | 日韩欧美一二三| 加勒比av一区二区| 久久亚洲综合色一区二区三区 | 看片的网站亚洲| 久久先锋影音av鲁色资源网| 国产精一区二区三区| 日本一区二区三级电影在线观看| 成人激情午夜影院| 亚洲精品乱码久久久久久久久| 在线看一区二区| 婷婷久久综合九色综合绿巨人| 欧美一区二区观看视频| 国产毛片精品视频| 国产精品污污网站在线观看| 一本久久a久久精品亚洲| 亚洲午夜激情av| 精品日韩一区二区| 成人在线综合网站| 亚洲精品免费在线播放| 欧美一区二区三区视频在线| 国产精品主播直播| 亚洲伦在线观看| 5月丁香婷婷综合| 国产宾馆实践打屁股91| 亚洲制服丝袜在线| 26uuu国产日韩综合| 91网址在线看| 麻豆成人综合网| 亚洲视频1区2区| 欧美va亚洲va香蕉在线| 91小视频免费观看| 免费成人美女在线观看.| 国产精品卡一卡二卡三| 777午夜精品视频在线播放| 国产不卡高清在线观看视频| 亚洲永久精品国产| 欧美精品一区二区三区很污很色的| 99精品桃花视频在线观看| 日韩电影在线一区| 亚洲色图欧洲色图| 精品国产区一区| 欧美视频一区二区三区| 国产成人高清在线| 日本中文字幕一区| 最好看的中文字幕久久| 精品日韩一区二区| 色综合中文字幕国产| 免费人成在线不卡| 亚洲精品国产无天堂网2021 | 一区二区三区日本| 国产无一区二区| 日韩欧美一区二区在线视频| 91视频在线观看| 国产福利电影一区二区三区|