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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? btcontent.cpp

?? linux系統下bt的客戶端實現。 采用的是c++
?? CPP
字號:
#include "Btcontent.h"#include <math.h>#include "Sha.h"#include "Tracker.h"#include <iostream.h>//////problem//1.how to set the cache size?//2.how to adjust the cache size dynamically?#define DEBUG(fmt, ...)  fprintf (stderr, fmt, __VA_ARGS__)#define max_uint64_t(a, b) ((uint64_t)(a) > (uint64_t)(b)) ? \(uint64_t) (a):(uint64_t) (b)#define min_uint64_t(a, b) \	((uint64_t) (a) > (uint64_t) (b)) ? \	(uint64_t) (b) : (uint64_t) (a)#define CACHE_HIT(p, offset, len) \(max_uint64_t((p)->bc_off, (offset)) <  min_uint64_t((p)->bc_off + (p)->bc_len, offset + len))btContent BTCONTENT;btContent::btContent(){	m_announce = NULL;	m_pbitmap = NULL;	m_create_date = (time_t) 0;	m_hash_table = NULL;	m_npieces = 0;	m_piece_length = 0;	m_left_bytes = 0;	m_cache_oldest = NULL;	m_cache_newest = NULL;	m_cache_size = 16 * 1024;	// how to set the cache size?	m_cache_used = 0;	memset(m_announce_list, 0, sizeof(char*)*20);}btContent::~btContent(){	delete m_announce;	delete m_hash_table;	delete m_cache;	    free_announce_list();	empty_cache();}void btContent::free_announce_list(){	char** p = m_announce_list;	for(; *p; p++)		delete [] (*p);}void btContent::empty_cache(){	BTCACHE *p = m_cache_newest, *pp = NULL;	for (; p;) {		pp = p->age_next;		delete[]p->bc_buf;		delete p;		p = pp;	}}int btContent::InitialFromMI(Bencode * pcode){	int i = 0;	Bencode* bp;	std::string keylist;    keylist = "announce";	if (!search_dictionary(pcode, keylist, (char **) &m_announce, NULL))		return -1;    	if(m_announce)	{		m_announce_list[i] = (char*)m_announce;		i++;	}	keylist = "announce-list";			if(NULL !=(bp = query_dict(pcode, keylist)))	{		if(bp->m_enumType != bencode_list)			return -1;		std::vector<Bencode*>::iterator iter, iter_end;		iter = ((BencodeList*)bp)->m_list.begin();		iter_end = ((BencodeList*)bp)->m_list.end();				for(;iter != iter_end; iter++)		{			BencodeList* plist;	        std::vector<Bencode*>::iterator iter1, iter1_end;						plist =  (BencodeList*)(*iter);			if(plist->m_enumType != bencode_list)					continue;			iter1 = plist->m_list.begin();			iter1_end = plist->m_list.end();						for(; iter1 != iter1_end; iter1++ )			{				BencodeString* pstr;				pstr = (BencodeString*)(*iter1);								int slen = pstr->m_strValue.length();				cout << pstr->m_strValue;				m_announce_list[i] = new char [slen + 1];				memcpy(m_announce_list[i], 						pstr->m_strValue.c_str(), slen);				m_announce_list[i][slen] = '\0';				cout<<m_announce_list[i]<<endl;				i++;			}		}	}    cout<<"asdfasdfsadf"<<endl;	keylist = "creation date";	if (!search_dictionary(pcode, keylist, NULL, (int *) &m_create_date))		return -1;	keylist = "info|pieces";	if (!search_dictionary		(pcode, keylist, (char **) &m_hash_table,		 (int *) &m_hash_table_length)		|| m_hash_table_length % 20 != 0)		return -1;	m_npieces = m_hash_table_length / 20;	keylist = "info|piece length";	if (!search_dictionary(pcode, keylist, NULL, (int *) &m_piece_length))		return -1;	if (m_btfiles.BuildFromMI(pcode) < 0 /*|| m_btfiles.CreateFiles() < 0*/)		return -1;/*	size_t n = m_btfiles.GetTotalLength() / m_piece_length +		(m_btfiles.GetTotalLength() % m_piece_length ? 1 : 0);	if (n != m_npieces)		return -1;	m_left_bytes = m_btfiles.GetTotalLength();*/	m_cache = new BTCACHE *[m_npieces];	if (NULL == m_cache) {		DEBUG("%s\n", "error! can't allocate the cache index memory");		return -1;	}	memset(m_cache, 0, sizeof(BTCACHE *) * m_npieces);	m_sha_buffer = new unsigned char[m_piece_length];	if (NULL == m_sha_buffer) {		DEBUG("%s\n", "error! can't allocate the sha buffer");		return -1;	}		m_pbitmap = new bitfield(m_npieces);//	memset(m_shake_buffer, 0, 68);	unsigned char *p = m_shake_buffer;	*p = (unsigned char) 19;	p++;	memcpy(p, "BitTorrent protocol", 19);	p += 19;	memset(p, 0, 8);		p  = m_shake_buffer + 48;	memcpy(p, "-CD0300-", 8);	p += 8;	unsigned char *dptr = p + 12;	while (dptr != p)		*p++ = (unsigned char) random();	return 0;}size_t btContent::GetPieceLength(size_t idx){	return (idx ==			m_btfiles.GetTotalLength() /			m_piece_length) ? m_btfiles.GetTotalLength() %		m_piece_length : m_piece_length;}int btContent::APieceComplete(size_t idx){	unsigned char md[20];	if (m_pbitmap->IsSet(idx))		return 1;	if (GetHashValue(idx, md) < 0) {		Uncache(idx);			//since error, uncache it		return -1;	}	if (memcmp(m_hash_table + idx * 20, md, 20) != 0)		return 0;	m_pbitmap->Set(idx);	m_left_bytes -= GetPieceLength(idx);	FlushCache(idx);	return 1;}void btContent::Uncache(size_t idx){	BTCACHE *p, *pnext;	for (p = m_cache[idx]; p && (p->bc_off / m_piece_length == idx);) {		pnext = p->bc_next;		if (p->bc_prev)			p->bc_prev->bc_next = p->bc_next;		else			m_cache[idx] = p->bc_next;		if (p->bc_next)			p->bc_next->bc_prev = p->bc_prev;		if (p->age_next)			p->age_next->age_prev = p->age_prev;		else			m_cache_oldest = p->age_prev;		if (p->age_prev)			p->age_prev->age_next = p->age_next;		else			m_cache_newest = p->age_next;		m_cache_used -= p->bc_len;		delete[]p->bc_buf;		delete p;		p = pnext;	}	if (NULL != m_cache[idx])		DEBUG("%s\n", "uncache error!");}int btContent::GetHashValue(size_t idx, unsigned char *md){	if (GetAPiece(idx, m_sha_buffer) < 0)		return -1;	Sha1(m_sha_buffer, GetPieceLength(idx), md);	return 0;}int btContent::GetAPiece(size_t idx, unsigned char *buf){	return ReadSlice(buf, idx, 0, GetPieceLength(idx));}ssize_t btContent::CacheIO(unsigned char *buf, uint64_t off, size_t len,						   int method){	BTCACHE *pnew, **p, *pp;	int idx, piece;	ssize_t ret = 0;	if (m_cache_size < m_cache_used + len)		CacheClean(len);	if (0 == method && buf		&& (m_btfiles.IO((char *) buf, off, len, method) < 0))		return -1;	pnew = new BTCACHE;	if (NULL == p)		return ret;	pnew->bc_buf = new char[len];	if (NULL == pnew->bc_buf) {		delete pnew;		return ret;	}	pnew->bc_off = off;	pnew->bc_len = len;	pnew->bc_f_flush = method;	m_cache_used += len;	memcpy(pnew->bc_buf, buf, len);	idx = off / m_piece_length;	p = &m_cache[idx];	pp = m_cache[idx];	for (; p && *p && (*p)->bc_off < off; pp = *p, p = &((*p)->bc_next));	pnew->bc_next = *p;	if (*p)		(*p)->bc_prev = pnew;	pnew->bc_prev = pp;	*p = pnew;	pp = m_cache_newest;	if (pp)		pp->age_prev = pnew;	pnew->age_prev = NULL;	pnew->age_next = pp;	if (NULL == m_cache_oldest)		m_cache_oldest = pnew;	m_cache_newest = pnew;	return ret;}void btContent::FlushCache(size_t idx){	BTCACHE *p;	if (idx == m_npieces)		p = m_cache_oldest;	else		p = m_cache[idx];	for (; p; p = (idx < m_npieces) ? p->bc_next : p->age_prev) {		if (!p->bc_f_flush			|| (idx < m_npieces && p->bc_off / m_piece_length != idx))			continue;		if (m_btfiles.IO(p->bc_buf, p->bc_off, p->bc_len, 1) < 0)			DEBUG("%s", "can't flush the cache");		p->bc_f_flush = 0;		if (p == m_cache_newest)			continue;/*		if (p->age_prev)			p->age_prev->age_next = p->age_next;		if (p->age_next)			p->age_next->age_prev = p->age_prev;		else if (p->age_prev)			m_cache_oldest = p->age_prev;		m_cache_newest->age_prev = p;		p->age_prev = NULL;		p->age_next = m_cache_newest;		m_cache_newest = p;*/	}}void btContent::CacheClean(size_t need){	BTCACHE *p, *pnext;	bool is_flushed = false;  again:	for (p = m_cache_oldest; p && m_cache_size < m_cache_used + need;		 p = pnext) {		pnext = p->age_prev;		if (p->bc_f_flush)			continue;		if (p->age_prev)			p->age_prev->age_next = p->age_next;		else			m_cache_newest = p->age_next;		if (p->age_next)			p->age_next->age_prev = p->age_prev;		else			m_cache_oldest = p->age_prev;		size_t idx = p->bc_off / m_piece_length;		if (p->bc_next)			p->bc_next->bc_prev = p->bc_prev;		if (p->bc_prev)			p->bc_prev->bc_next = p->bc_next;		else			m_cache[idx] = p->bc_next;		m_cache_used += p->bc_len;		delete p->bc_buf;		delete p;	}	if (m_cache_size < m_cache_used + need && m_cache_used && !is_flushed) {		FlushCache();		is_flushed = true;		goto again;	}}ssize_t btContent::ReadSlice(unsigned char *buf, size_t idx, size_t off,							 size_t len){	BTCACHE *p;	ssize_t retval = 0;	uint64_t offset = idx * m_piece_length + off;	p = m_cache[idx];	for (; p && !CACHE_HIT(p, offset, len); p = p->bc_next);	size_t len2 = 0;	bool rescan = false;	for (; p && len && CACHE_HIT(p, offset, len);) {		if (offset < p->bc_off) {			if (CacheIO(buf, offset, p->bc_off - offset, 0) < 0) {				cout << "cache failed" << endl;				return -1;			}			len2 = p->bc_off - offset;			rescan = true;		} else if (offset > p->bc_off) {			len2 =				((p->bc_off + p->bc_len) - offset) >				len ? len : ((p->bc_off + p->bc_len) - offset);			if (buf)				memcpy(buf, p->bc_buf + offset - p->bc_off, len2);		} else					//equal		{			len2 = p->bc_len > len ? len : p->bc_len;			if (buf)				memcpy(buf, p->bc_buf, len2);		}		len -= len2;		buf += len2;		offset += len2;		if (!rescan)			p = p->bc_next;	}	if (len) {		if (CacheIO(buf, offset, len, 0) < 0) {			cout << "cache failed" << endl;			return -1;		}	}	return 0;}ssize_t btContent::WriteSlice(unsigned char *buf, size_t idx, size_t off,size_t len){	BTCACHE *p;	uint64_t offset = idx * m_piece_length + off;	if (NULL == buf)		return -1;	p = m_cache[idx];	for (; p && !CACHE_HIT(p, offset, len); p = p->bc_next);	bool rescan = false;	size_t len2 = 0;	for (; p && len && CACHE_HIT(p, offset, len);) {		if (p->bc_off > offset) {			if (CacheIO(buf, offset, len, 1) < 0)				return -1;			len2 = p->bc_off - offset;			rescan = true;		} else if (p->bc_off < offset) {			len2 =				p->bc_len - offset + p->bc_off >				len ? len : p->bc_len - offset + p->bc_off;			memcpy(p->bc_buf + offset - p->bc_off, buf, len2);		} else {			len2 = p->bc_len > len ? len : p->bc_len;			memcpy(p->bc_buf, buf, len2);		}		len -= len2;		buf += len2;		offset += len2;		if (!rescan)			p = p->bc_next;	}	if (len) {		if (CacheIO(buf, offset, len, 1) < 0) {			cout << "write cache failed " << endl;			return -1;		}	}	return 0;}ssize_t btContent::ReadPiece(size_t idx, unsigned char *buff){	return ReadSlice(buff, idx, 0, GetPieceLength(idx));}void btContent::printout(){	BTCACHE *p = m_cache_newest;	char *q;	int i = 0;	for (; i < 100; i++) {		for (p = m_cache[i]; p; p = p->bc_next) {			printf("%d\n", p->bc_off);			int k = 0;			for (q = p->bc_buf; k < p->bc_len; q++, k++)				printf("%c", *q);			printf("\n");		}	}	/*	   p = m_cache_oldest;	   for (; p; p = p->age_prev) {	   printf("%d\n", p->bc_off);	   for (q = p->bc_buf, i = 0; i < p->bc_len; q++, i++)	   printf("%c", *q);	   printf("\n");	   } */}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品无人码麻豆乱码1区2区 | 国产亚洲精品福利| 亚洲欧美日韩人成在线播放| 久久国产精品99精品国产 | 欧美影片第一页| 国产视频亚洲色图| 青青国产91久久久久久 | 欧美一级生活片| 亚洲女同一区二区| 国产成人av电影| 日韩一区二区不卡| 五月婷婷激情综合网| 欧美亚洲图片小说| 亚洲精品视频在线看| 成人激情动漫在线观看| 国产日产亚洲精品系列| 九九九久久久精品| 日韩欧美的一区| 日日骚欧美日韩| 欧美军同video69gay| 一区二区三区产品免费精品久久75| 成人自拍视频在线观看| 久久久九九九九| 国产一区三区三区| 亚洲精品在线观看网站| 麻豆高清免费国产一区| 日韩午夜电影在线观看| 日韩精品久久久久久| 日韩视频在线永久播放| 久久黄色级2电影| 欧美哺乳videos| 久久精品二区亚洲w码| 精品国产免费一区二区三区四区| 美国十次了思思久久精品导航| 欧美一区二区在线视频| 麻豆精品新av中文字幕| 亚洲精品一区二区三区精华液| 久久国产人妖系列| 欧美国产日韩在线观看| 91色.com| 午夜国产精品一区| 亚洲精品在线免费观看视频| 国产高清视频一区| 国产精品高潮久久久久无| 色伊人久久综合中文字幕| 亚洲国产精品久久久久婷婷884| 欧美精品v日韩精品v韩国精品v| 久久精品国产精品青草| 欧美激情综合在线| 91成人免费电影| 日韩精品亚洲专区| 久久精品一区二区三区四区| 91在线精品一区二区三区| 亚洲图片自拍偷拍| 欧美成人高清电影在线| av激情成人网| 婷婷成人综合网| 欧美韩国日本综合| 欧美日韩国产另类不卡| 国产成人一区在线| 亚洲国产欧美在线人成| 久久久久久一二三区| 色综合婷婷久久| 久久激五月天综合精品| 专区另类欧美日韩| 日韩欧美专区在线| 91浏览器打开| 国产精品资源在线观看| 亚洲综合在线视频| 国产日韩欧美精品在线| 在线播放91灌醉迷j高跟美女| 国产精品一区一区三区| 五月天中文字幕一区二区| 中文字幕不卡的av| 欧美一二三区在线观看| 色综合久久久久久久久| 国产曰批免费观看久久久| 婷婷一区二区三区| 国产精品久久久久aaaa樱花 | 欧美亚洲一区三区| 国产不卡免费视频| 久久99精品久久久久久国产越南| 樱桃视频在线观看一区| 欧美国产日韩亚洲一区| 日韩免费高清电影| 欧美放荡的少妇| 91免费视频大全| 成人激情免费电影网址| 久久99精品久久久久久动态图| 五月天久久比比资源色| 一个色在线综合| 国产精品白丝在线| 久久精品在线观看| 精品国产一区二区三区四区四| 欧美日韩亚洲综合一区 | 成人免费看的视频| 国模冰冰炮一区二区| 麻豆精品一区二区| 日本sm残虐另类| 天堂资源在线中文精品| 亚洲一区二区三区美女| 一区二区三区美女| 亚洲精品久久嫩草网站秘色| 国产精品久久影院| 国产精品久久久久久久蜜臀| 国产视频亚洲色图| 欧美国产精品一区二区三区| 国产日韩精品一区二区浪潮av| 亚洲精品在线网站| 国产亚洲综合性久久久影院| 欧美精品一区二区三区一线天视频| 欧美一区二区视频网站| 欧美一卡在线观看| 日韩欧美在线观看一区二区三区| 91精品国产综合久久国产大片| 欧美军同video69gay| 日韩一级在线观看| 久久综合色播五月| 久久久久综合网| 国产精品成人免费| 一区二区三区在线视频观看58| 亚洲成a人v欧美综合天堂| 亚洲成人tv网| 久久成人免费日本黄色| 国产精品一区二区在线观看网站| 国产精品911| 色婷婷亚洲精品| 欧美日韩成人一区| 精品欧美一区二区久久| 亚洲国产精品精华液ab| 国产精品传媒视频| 午夜在线成人av| 精品一区二区在线看| 国产成人精品1024| 欧美午夜一区二区三区 | 激情五月婷婷综合网| 国产精品18久久久久久久网站| 成人午夜视频在线观看| 欧美色手机在线观看| 欧美大胆一级视频| 国产精品久99| 日日骚欧美日韩| 成人sese在线| 日韩午夜精品视频| 成人欧美一区二区三区白人| 日韩高清不卡一区二区三区| 国产精品一区二区91| 欧美影片第一页| 国产日韩欧美综合一区| 亚洲国产毛片aaaaa无费看| 国内成+人亚洲+欧美+综合在线| 99re在线视频这里只有精品| 7777精品久久久大香线蕉| 中文字幕va一区二区三区| 日韩二区三区四区| 91视视频在线观看入口直接观看www | 国产酒店精品激情| 欧美视频三区在线播放| 久久精品一区二区| 五月天视频一区| av电影在线观看不卡| 日韩久久久精品| 亚洲综合久久久| 成人av在线一区二区| 日韩欧美国产综合一区| 亚洲成在人线在线播放| 成人黄色在线网站| 精品国产一区二区精华| 午夜精品久久久久久久99水蜜桃| 成人av电影在线观看| 久久久久亚洲蜜桃| 六月丁香婷婷色狠狠久久| 欧美日韩精品一区二区三区蜜桃| 国产精品入口麻豆九色| 国产在线一区二区| 日韩一区二区三区观看| 亚洲自拍另类综合| 91蜜桃免费观看视频| 国产精品拍天天在线| 国产一区二区三区黄视频 | 国产精品网站在线观看| 国产一区二区三区综合| 日韩你懂的电影在线观看| 偷拍日韩校园综合在线| 91官网在线免费观看| 国产精品伦一区| 成人午夜大片免费观看| 久久理论电影网| 国产资源精品在线观看| 欧美一区二区三区在线观看 | 日韩欧美不卡一区| 老色鬼精品视频在线观看播放| 欧美美女bb生活片| 亚洲1区2区3区4区| 在线电影欧美成精品| 日本欧美一区二区| 日韩精品综合一本久道在线视频| 日韩制服丝袜av| 日韩午夜精品电影| 黄色精品一二区|