BitTorrent 协议规范(BT协议集合)二一

FPGA信号处理系列文章——分数倍插值抽取滤波器(一) 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 FPGA信号处理系列文章——分数倍插值抽取滤波器(一)前言信号流matlab模型频谱示意图分析总结 前言 变采样率滤波器不仅仅存在整数倍插值和整数倍抽取的情况,还会存在分数倍插值抽取的情况。那这种情况下要怎么处理呢 信号流 分数倍插值抽取滤波器的信号流是什么?信号先进行插值,再进行FIR滤波,最后进行抽取 matlab模型 %signal 定点化数据输入 coeff_val_fir = importdata('fir.coe'); si 阅读详情

 BT客户端开始一个下载首先要处理的就是torrent文件.
而torrent文件使用bencoding编码.
所以实现bencoding编码的解析器,就是第一步工作.

Bencoding is done as follows:
Strings are length-prefixed base ten followed by a colon and the string. For e
xample '4:spam' corresponds to 'spam'.
Integers are represented by an 'i' followed by the number in base 10 followed
by an 'e'. For example 'i3e' corresponds to 3 and 'i-3e' corresponds to -3. In
tegers have no size limitation. 'i-0e' is invalid. All encodings with a leadin
g zero, such as 'i03e', are invalid, other than 'i0e', which of course corresp
onds to 0.
Lists are encoded as an 'l' followed by their elements (also bencoded) followe
d by an 'e'. For example 'l4:spam4:eggse' corresponds to ['spam', 'eggs'].
Dictionaries are encoded as a 'd' followed by a list of alternating keys and t
heir corresponding values followed by an 'e'. For example, 'd3:cow3:moo4:spam4
:eggse' corresponds to {'cow': 'moo', 'spam': 'eggs'} and 'd4:spaml1:a1:bee' c
orresponds to {'spam': ['a', 'b']} . Keys must be strings and appear in sorted
order (sorted as raw strings, not alphanumerics).

下面是实现的bencoding解码器的VC++源代码:

 

// BEncode.h: interface for the CBEncode class. 
// 
////////////////////////////////////////////////////////////////////// 

#if !defined(AFX_BENCODE_H__4D0BB462_2AE0_45B3_8BE8_19D51B2DBB2E__INCLUDED_) 
#define AFX_BENCODE_H__4D0BB462_2AE0_45B3_8BE8_19D51B2DBB2E__INCLUDED_ 

#if _MSC_VER > 1000 
#pragma once 
#endif // _MSC_VER > 1000 
#pragma warning( disable : 4786 ) 
#pragma warning( disable : 4355 ) 
#include 
#include 
#include 
#include 
using namespace std; 
enum BEncodeParserErrorCode 
{ 
  enm_BEncodeErr_noerr 
= 0,//没有错误    
  enm_BEncodeErr_errString,//错误的字符串 
  enm_BEncodeErr_errInt,//错误的整型数据 
  enm_BEncodeErr_errList,//错误的列表 
  enm_BEncodeErr_errDict,//错误的词典结构 
  enm_BEncodeErr_End,//文本结束 
  enm_BEncodeErr_unknown//未知错误 
}; 
enum BEncodeObjectType 
{ 
  enum_BEncodeType_Objectbase 
= 0,    
  enum_BEncodeType_String, 
  enum_BEncodeType_Int, 
  enum_BEncodeType_List, 
  enum_BEncodeType_Dict, 
}; 
class CBEncodeObjectBase 
{ 
public: 
  CBEncodeObjectBase(BEncodeObjectType type 
= enum_BEncodeType_Objectbase){m 
_type 
= type;clear();} 
  
virtual ~CBEncodeObjectBase(){}; 
  
void clear(){szPos = NULL;m_error = enm_BEncodeErr_noerr;} 
public: 
  BEncodeObjectType m_type;   
//对象类型 
  char * szPos;   //对象在字符串中的位置 
  int ilen;//对象的数据长度 
  BEncodeParserErrorCode m_error;//错误值    
}; 
class CBEncodeInt : public CBEncodeObjectBase 
{ 
public: 
  CBEncodeInt() : CBEncodeObjectBase(enum_BEncodeType_Int) {} 
  
virtual ~CBEncodeInt(){}       
public:    
  
int m_iValue;//整型对象的值 
}; 
class CBEncodeString : public CBEncodeObjectBase 
{ 
public: 
  CBEncodeString() : CBEncodeObjectBase(enum_BEncodeType_String) {m_szData 
= 
NULL;} 
  
virtual ~CBEncodeString(){}       
public:    
  
bool getstring(string & strValue) 
  { 
    
if(m_error == enm_BEncodeErr_noerr && m_szData) 
    { 
        strValue.assign(m_szData,m_ilen); 
        
return true; 
    } 
    
return false; 
  } 
  
char * m_szData; 
  
int m_ilen; 
}; 
class CBEncodeList : public CBEncodeObjectBase 
{ 
public: 
  CBEncodeList() : CBEncodeObjectBase(enum_BEncodeType_List) {} 
  
virtual ~CBEncodeList(){clear();} 
  
void clear() 
  {          
    list::iterator it; 
    
for(it = m_listObj.begin();it!=m_listObj.end();++it) 
        delete (
*it); 
    m_listObj.clear(); 
  } 
public:    
  list m_listObj; 
}; 
class CBEncodeDict : public CBEncodeObjectBase 
{ 
public: 
  CBEncodeDict() : CBEncodeObjectBase(enum_BEncodeType_Dict) {} 
  
virtual ~CBEncodeDict(){clear();} 
  CBEncodeObjectBase
* getvalue(const char * szName) 
  { 
    map::iterator it 
= m_mapObj.find(szName); 

    
if(it != m_mapObj.end()) 
        
return it->second; 
    
return NULL; 
  } 
  
void clear() 
  {          
    list::iterator it; 
    
for(it = m_listObj.begin();it!=m_listObj.end();++it) 
        delete (
*it); 
    m_listObj.clear(); 
    m_mapObj.clear(); 
  } 
public:    
  map m_mapObj;
// 
  list m_listObj;//真正的对象保存在list中,list是一个nam 
e对象一个value对象.map只是一个映射表,引用了指针而已 
}; 
class CBEncode 
{ 
public: 
  
bool readint(char *szCurPos,int & iendpos,list & list 
Obj); 
  
bool readstring(char *szCurPos,int & iendpos,list & l 
istObj);    
  
bool readlist(char *szCurPos,int & iendpos,list & lis 
tObj);    
  
bool readdict(char *szCurPos,int & iendpos,list & lis 
tObj);    
  
bool parse(const char * szData); 
  CBEncode(); 
  
virtual ~CBEncode(); 
  
void clear() 
  {    
    list::iterator it; 
    
for(it = m_listObj.begin();it!=m_listObj.end();++it) 
        delete (
*it); 
    m_listObj.clear();    
  } 
public: 
  list m_listObj; 
  CBEncodeObjectBase
* m_plastObj;//解析出来的最后一个对象 
  char * m_szTxt; 
}; 

#endif // !defined(AFX_BENCODE_H__4D0BB462_2AE0_45B3_8BE8_19D51B2DBB2E__INCLUD 
ED_) 

// BEncode.cpp: implementation of the CBEncode class. 
// 
////////////////////////////////////////////////////////////////////// 

#include 
"stdafx.h" 
#include 
"BEncode.h" 

////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 

CBEncode::CBEncode() 
{ 
  m_plastObj 
= NULL; 
  m_szTxt 
= NULL; 
} 

CBEncode::
~CBEncode() 
{ 
  clear(); 
} 

bool CBEncode::parse(const char *szData) 
{ 
  
if(szData == NULL||*szData==NULL) 
    
return false; 
  clear(); 
  m_szTxt 
= (char*)szData; 
  
char * szCurPos = (char*)szData; 
  
int iendpos; 
  
while(*szCurPos) 
  {    
    
if(*szCurPos== 'i') 
    { 
        
if(!readint(szCurPos,iendpos,m_listObj)) 
          
break;//遇到任何错误都终止整个解析 
        szCurPos+=iendpos; 
    } 
    
else if(*szCurPos== 'l') 
    { 
        
if(!readlist(szCurPos,iendpos,m_listObj)) 
          
break; 
        szCurPos
+=iendpos; 
    } 
    
else if(*szCurPos== 'd') 
    { 
        
if(!readdict(szCurPos,iendpos,m_listObj)) 
          
break; 
        szCurPos
+=iendpos; 
    } 
    
else          
    { 
        
if(!readstring(szCurPos,iendpos,m_listObj)) 
          
break; 
        szCurPos
+=iendpos; 
    } 
  } 
  
if(*szCurPos==0&&m_plastObj->m_error == enm_BEncodeErr_noerr) 
    
return true; 
  
return false; 
} 
//从当前位置读取一个字符串 
bool CBEncode::readstring(char *szCurPos,int & iendpos,list*> & listObj) 
{    
  
char * szTmp = szCurPos; 
  CBEncodeString 
* pNewString = new CBEncodeString;    
  pNewString
->szPos = szCurPos; 

  
char szLen[20]; 
  
int i = 0; 
  
while(*szTmp>='0'&&*szTmp<='9') 
    szLen[i
++]=*(szTmp++); 
  szLen
=0; 
  
if(*szTmp==':') 
  { 
    
int ilen = atoi(szLen); 
    
if(ilen>0) 
    {    
        pNewString
->m_szData = ++szTmp; 
        pNewString
->m_ilen = ilen; 
        szTmp
+=ilen; 
    } 
    
else 
        pNewString
->m_error = enm_BEncodeErr_errString; 
  } 
  
else 
    pNewString
->m_error = enm_BEncodeErr_errString; 
  listObj.push_back(pNewString); 
  iendpos 
= szTmp-szCurPos;          
  m_plastObj 
= pNewString; 
  m_plastObj
->ilen = iendpos; 
  
return pNewString->m_error == enm_BEncodeErr_noerr?true:false; 
} 
//读取一个整型数据 
bool CBEncode::readint(char *szCurPos,int & iendpos,list 
& listObj) 
{ 
  
char * szTmp = szCurPos; 
  CBEncodeInt 
* pNewInt= new CBEncodeInt;    
  pNewInt
->szPos = szCurPos; 

  
if(*szTmp == 'i') 
  {    
    szTmp
++; 
    
char szLen[20]; 
    
int i = 0; 
    
while(*szTmp>='0'&&*szTmp<='9') 
        szLen[i
++]=*(szTmp++); 
    szLen
=0; 
    
if(*szTmp=='e') 
    { 
        pNewInt
->m_iValue = atoi(szLen);          
        
++szTmp; 
    } 
    
else 
        pNewInt
->m_error = enm_BEncodeErr_errInt; 
  } 
  
else 
    pNewInt
->m_error = enm_BEncodeErr_errInt; 
  listObj.push_back(pNewInt); 
  iendpos 
= szTmp-szCurPos;    
  m_plastObj 
= pNewInt; 
  m_plastObj
->ilen = iendpos; 
  
return pNewInt->m_error == enm_BEncodeErr_noerr?true:false; 
}
//读取一个列表 
bool CBEncode::readlist(char *szCurPos,int & iendpos,list 
& listObj) 
{ 
  
char * szTmp = szCurPos; 
  CBEncodeList 
* pNewList= new CBEncodeList; 
  pNewList
->szPos = szCurPos; 
  
if(*szTmp == 'l') 
  { 
    szTmp
++; 
    
int ilistendpos; 
    
while(*szTmp!='e') 
    { 
        
if(*szTmp== 'i') 
        { 
          
if(!readint(szTmp,ilistendpos,pNewList->m_listObj)) 
            
break;//遇到任何错误都终止整个解析 
          szTmp+=ilistendpos; 
        } 
        
else if(*szTmp== 'l') 
        { 
          
if(!readlist(szTmp,ilistendpos,pNewList->m_listObj)) 
            
break; 
          szTmp
+=ilistendpos; 
        } 
        
else if(*szTmp== 'd') 
        { 
          
if(!readdict(szTmp,ilistendpos,pNewList->m_listObj)) 
            
break; 
          szTmp
+=ilistendpos; 
        } 
        
else          
        { 
          
if(!readstring(szTmp,ilistendpos,pNewList->m_listObj)) 
            
break; 
          szTmp
+=ilistendpos; 
        } 
    }    
    
if(*szTmp!='e'||m_plastObj->m_error != enm_BEncodeErr_noerr) 
        pNewList
->m_error = enm_BEncodeErr_errList; 
    
else 
        szTmp
++; 
  } 
  
else 
    pNewList
->m_error = enm_BEncodeErr_errList; 
  listObj.push_back(pNewList); 
  iendpos 
= szTmp-szCurPos; 
  m_plastObj 
= pNewList; 
  m_plastObj
->ilen = iendpos; 
  
return pNewList->m_error == enm_BEncodeErr_noerr?true:false; 
} 
//读取一个字典 
bool CBEncode::readdict(char *szCurPos,int & iendpos,list 
& listObj) 
{ 
  
char * szTmp = szCurPos; 
  CBEncodeDict 
* pNewDict= new CBEncodeDict; 
  pNewDict
->szPos = szCurPos;    
  
if(*szTmp == 'd') 
  {       
    szTmp
++; 
    
int ilistendpos; 
    
string strname; 
    
while(*szTmp!='e') 
    { 
        
if(!readstring(szTmp,ilistendpos,pNewDict->m_listObj)) 
          
break; 
        
if(m_plastObj->m_type !=enum_BEncodeType_String) 
          
break;          
        strname.assign(((CBEncodeString 
*)m_plastObj)->m_szData,((CBEncode 
String 
*)m_plastObj)->m_ilen); 
        szTmp
+=ilistendpos; 
        
if(*szTmp== 'i') 
        { 
          
if(!readint(szTmp,ilistendpos,pNewDict->m_listObj)) 
            
break;//遇到任何错误都终止整个解析 
          szTmp+=ilistendpos; 
        } 
        
else if(*szTmp== 'l') 
        { 
          
if(!readlist(szTmp,ilistendpos,pNewDict->m_listObj)) 
            
break; 
          szTmp
+=ilistendpos; 
        } 
        
else if(*szTmp== 'd') 
        { 
          
if(!readdict(szTmp,ilistendpos,pNewDict->m_listObj)) 
            
break; 
          szTmp
+=ilistendpos; 
        } 
        
else          
        { 
          
if(!readstring(szTmp,ilistendpos,pNewDict->m_listObj)) 
            
break; 
          szTmp
+=ilistendpos; 
        } 
        pNewDict
->m_mapObj.insert(pair(strname 
,m_plastObj));          
    }    
    
if(*szTmp!='e'||m_plastObj->m_error != enm_BEncodeErr_noerr) 
        pNewDict
->m_error = enm_BEncodeErr_errDict; 
    
else 
        szTmp
++; 
  } 
  
else 
    pNewDict
->m_error = enm_BEncodeErr_errDict; 
  listObj.push_back(pNewDict); 
  iendpos 
= szTmp-szCurPos; 
  m_plastObj 
= pNewDict;    
  m_plastObj
->ilen = iendpos; 
  
return pNewDict->m_error == enm_BEncodeErr_noerr?true:false; 
}


Gazebo手册:【1】gazebo基本操作案例 欢迎来到初学者模块!本模块将引导您了解 Gazebo 的最基本功能。我们将构建一个简单的车辆来演示这些功能。这些教程适用于 Gazebo 新手和/或没有编程或 Linux 经验的人。 每个教程都建立在上一个教程的基础上,因此我们建议您按顺序学习这些教程。 一、何为Gazebo? Gazebo 是一款 3D 动态模拟器,能够准确有效地模拟复杂室内和室外环境中的机器人种群。虽然类似于游戏引擎,但 Gazebo 提供了更高保真度的物理模拟、一套传感器以及用于用户和程序的接口。 1............ 阅读详情

相关推荐

第7.1章:StarRocks性能调优——查询分析

第7.1章:StarRocks性能调优——查询分析

爱吃辣条的博客 6476

BT协议集合

BT协议集合2008-02-25 18:20BitTorrent 协议规范(BT协议集合)一 BitTorrent 是一种分发文件的协议。它通过URL来识别内容,并且可以无缝的和web进行交互。它基于HTTP协议,它的优势是:如果有多个下载者并发的下载同一个文件,那么,每个下载者也同时为其它下载者上传文件,这样,文件源可以支持大量的用户进行下载,而只带来适当的负载的增长

Lixinag的专栏 1893

Labview执行adbshell操作

一、目录 1、实现思路 2、adbshell工具配置 3、Labview执行命令窗口 1、实现思路 使用Labview的优点: 1、可以配合电源系统或者调用其他接口工具实现更高程度的自动化测试; 2、直接执行Linux相关命令,编写相关执行顺序或者逻辑更简易; --------可以用adbpush命令将.sh的脚本文件推入控制器内部执行; 3、Ubuntu系统比较大,如果只是日常执行脚本测试还是比较占用磁盘空间; 2、adbshell工具配置 1)下载adbshell工具; adbshell工具下载链

zataji的博客 2053

BitTorrent 协议规范(BT协议集合)十二

作者:小马哥 概述: 相对于 tracker 服务器来说,BT客户端要复杂的多,Bram Cohen 花了一年 full time 的时间来完成 BT,我估计其中大部分时间是用在 BT 客户端的实现和调试上了。 由于 BT 客户端涉及的代码比较多,我不能再象分析 tracker 服务器那样,走上来就深入到细节之中去,那样的话,我写的晕晕糊糊,大家看起来也不知所云。所以第一篇文章先来谈谈客户端的功能

1037

基于卷积神经网络的人脸表情识别(JAFFE篇)

1.win10/11操作系统2.python3.7以上3.tensorflow2.4以上版本(2.0其它版本需要微调)4.内存12G,显卡4G以上(没有独显倒是也能跑...)(这个可爱的妹子就是JAFFE数据集中的图片)

小林同学的计算机学习 5913

简谈基于FPGA的千兆以太网设计

简谈基于FPGA的千兆以太网设计 今天给大侠带来简谈基于FPGA的千兆以太网设计,话不多说,上货。 今天我们来简单的聊一聊以太网,以太网在FPGA学习中属于比较高级的内容了,有些大侠肯定会感觉以太网学习起来非常不容易。其实,我可以告诉大家,前期学习的基础打扎实了,后期的学习也没那么难。总之就是说难没那么难,说容易也不是那么容易。那么,言归正传,下面让我们一起来聊一聊以太网的学习。 说起以太网,大家可能就会想到百兆以太网、千兆以太网以及万兆以太网等等。局域以太网从10M开始发展,经历几多的变迁,发展到现

3620

BitTorrent 协议规范(BT协议集合)二三

概要      上一节我们分析了BT客户端与tracker之间的通信过程。通过与 tracker 的通信,客户端获得了参与下载的其它peers 的列表。有了这些 peers 的信息,客户端就可以主动向它们发起连接,为进一步从它们那里获取所需要的文件片断做好准备。这些连接称为“主动连接”。因为连接的发起方是客户端自己。      同时,每个客户端在启动以后,都会监听某个端口,用于接受其它 peers

1265

20 Embedding 与向量检索:语义为什么能变成距离

Embedding 是 RAG 语义检索的数学基础。本文用工程视角讲清文本如何变成向量,为什么语义相近会表现为距离相近,Top-K 检索如何工作,以及在模型选择、同模型约束、精确匹配和召回评估上的常见坑。

老于的笔记的专栏 6203

BitTorrent 协议规范(BT协议集合)二二

昨天重新读了BT协议和客户端代码,发现对协议本身部分比较熟悉了,但是对BT在实际运行期间各种行为的发生情景还非常模糊,有些步骤还想清楚,大家一起来讨论一下. 我们来一起描述一下BT各种消息的发送情景. 有些不是特别肯定的我没有加上,大家在这个基础上进行增加或者修改. 其中client指本机上运行的BT客户端.peer指tracker返回的远程客户端. piece指torrent文件中的20byte

1297

【目标追踪】python背景模型减除法原理及其实现

python基于背景模型差法的视频目标追踪帧差法的问题:背景模型差法目标追踪原理1. 基本思路:2. 图例讲解:3. 存在的问题&如何解决:4. 最终效果预览第一步——调用摄像头:1. 使用opencv打开视频or摄像头:2. 读取逐帧图片:第二步——处理图片:1. 转换成灰度图:3. 累加权重重构背景:3. 计算像素差:3. 使用中值滤波和膨胀腐蚀去噪:3.1 中值滤波:3.2 图像腐蚀...

梁瑛平的博客 1948

Google Earth Engine ——在 GEE 中计算面积含各类要素计算(土地分类为例)

在遥感应用中工作时,许多操作需要计算面积。例如,需要在监督分类后计算每个类所覆盖的面积,或者找出灾害后区域内受影响的面积。计算栅格和矢量的面积在大多数软件包中是一个简单的操作,但在 Google Earth Engine 中以稍微不同的方式完成 - 这可能会让初学者感到困惑。在这篇文章中,我将概述计算矢量和图像面积的方法。我们将涵盖以下主题,从简单到复杂。 特征的面积计算,即矢量数据 图像的面积计算(单类) 按类别计算图像的面积 按区域按类别计算图像的面积 按年按地区按类别计算图像的面积 准备数据

此星光明博客 4024

BitTorrent 协议规范(BT协议集合)三

Bittorrent udp-tracker protocol extension Contents introduction connecting Client sends packet: Server replies with packet: announcing Client sends packet: Server replies with packet: scraping Client

1029

Test软件:Keysight二次开发_(3).安装与配置开发环境

在开始进行Keysight软件的二次开发之前,首先需要确保您的开发环境已经正确安装和配置。本节将详细介绍如何安装和配置必要的开发工具和依赖项,以便您能够顺利进行开发工作。

2401_87715305的博客 1413

BitTorrent 协议规范(BT协议集合)二四

BitTorrent是一个优秀的P2P下载软件,国内又叫它BT(变态)。 BT的主页:http://bitconjurer.org/BitTorrent/index.html BT的作者:Bram Cohen,《程序员》杂志2004第3期有对他的介绍文章 BT所用的语言:python python:一种优秀的动态语言(关于动态语言的介绍,看《程序员》杂志2004年第5期)。 python的官方网站

1541

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

BitTorrent 协议规范(BT协议集合)十八

客户端源码分析之六:客户端的主程序 作者:小马哥 前言: 自从7月份写完“客户端源码分析之五:Encoder 与 Connection 类”后,我就停止了继续对BT源码的分析。原因很多,最主要的还是懒惰吧。临到岁末,终于下定决心,无论如何,要完成这一系列的文章,对自己也算有个交待。 前面的几篇文章,都是深入到源码的某一部分细节之中,虽然很清晰,但无助于读者对整体构架的把握(其实我自己当时也比较糊涂

926

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

BitTorrent 协议规范(BT协议集合)

BitTorrent 协议规范(BT协议集合)翻译:小马哥 日期:2004-5-22 BitTorrent 是一种分发文件的协议。它通过URL来识别内容,并且可以无缝的和web进行交互。它基于HTTP协议,它的优势是:如果有多个下载者并发的下载同一个文件,那么,每个下载者也同时为其它下载者上传文件,这样,文件源可以支持大量的用户进行下载,而只带来适当的负载的增长。(译注:因为大量的负载被均衡到整个

gogl的专栏 1875

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

BitTorrent 协议规范(BT协议集合)二

这个翻译版本由孤波独立完成 原文见http://bitconjurer.org/BitTorrent/protocol.html 作者Bram Cohen 孤波享有对该翻译版本解释权修改权 非商业引用请注明译者 BitTorrent协议详解 BitTrrent(简称BT,比特洪流)是一个文件分发协议,它通过URL识别内容并且和网络无缝结合。它在HTTP平台上的优势在于,同时下在一个文件的下载者在下

1043

BitTorrent 协议规范(BT协议集合)一

BitTorrent 是一种分发文件的协议。它通过URL来识别内容,并且可以无缝的和web进行交互。它基于HTTP协议,它的优势是:如果有多个下载者并发的下载同一个文件,那么,每个下载者也同时为其它下载者上传文件,这样,文件源可以支持大量的用户进行下载,而只带来适当的负载的增长。(译注:因为大量的负载被均衡到整个系统中,所以提供源文件的机器的负载只有少量增长) 一个BT文件分布系统由下列实体组成:

1026

BitTorrent 协议规范(BT协议集合)十七

Encoder 是一种 Handler 类(关于 Handler类,请参看前面的分析文章)。它在 download.py 中被初始化。它与 Connection类一起,完成“BT对等连接”的建立,以及“BT对等协议”的分析。 为了有助于理解,我添加了一些用圆圈括起来的序号,建议你按照这个顺序去阅读。 class Connection:   ②def __init__(self, Encoder,

929

BitTorrent 协议规范(BT协议集合)九

Tracker服务器源码分析之一:总述 作者:小马哥 日期:2004-5-29   tracker服务器是BT下载中必须的角色。一个BT client 在下载开始以及下载进行的过程中,要不停的与 tracker 服务器进行通信,以报告自己的信息,并获取其它下载client的信息。这种通信是通过 HTTP 协议进行的,又被称为 tracker HTTP 协议,它的过程是这样的:   client 向

1320

BitTorrent 协议规范(BT协议集合)二十

作者:小马哥 本篇文章分析 Tracker 类,它在 track.py 文件中。 在分析之前,我们把前几篇文章的内容再回顾一下,以理清思路。 BT的源码,主要可以分为两个部分,一部分用来实现 tracker 服务器,另一部分用来实现BT的客户端。我们这个系列的文章围绕 tracker 服务器的实现来展开。 BT 客户端与 tracker 服务器之间,通过 track HTTP协议进行通信,而BT客

1057

BitTorrent 协议规范(BT协议集合)十九

客户端源码分析之七:客户端与tracker通信过程4VM 作者:小马哥 l概要 上一节我们分析了BT客户端主程序的框架:一个循环的服务器程序。在这个循环过程中,客户端要完成如下任务:l Ø与 tracker 服务器通信;汇报自己的状态,同时获取其它 peers 的信息;. Ø接受其它 peers 的连接请求;a%dv Ø主动向某些 peers 发起连接请求;8 Ø对BT对等协议的分析处理;kn Ø

1259

BitTorrent 协议规范(BT协议集合)十

Tracker服务器源码分析之二:RawServer类 作者:小马哥 这篇文章,我们来分析 RawServer 以及一些相关的类。RawServer 类的实现代码,在 BitTorrent 子目录的RawServer.py 中 RawServer 这个类的作用是实现一个网络服务器。关于网络编程的知识,《unix网络编程:卷1》是最经典的书籍,你如果对这块不了解,建议抽时间看看这本书。RawServ

1208

BitTorrent 协议规范(BT协议集合)六

BT是如何采用激励机制来达到健壮性的 Bram Cohen bram@bitconjurer.org 2003年5月22日 翻译:小马哥 日期:2004-6-1 修改:扬帆 日期:2005-5-9 概要 BitTorrent 文件发布系统采用针锋相对(tit_for_tat)的方法来达到帕累托有效,与当前已知的协作技术相比,它具有更高的活力。本文将解释BitTorrent 的用途,以及是怎样用经济

1100

BitTorrent 协议规范(BT协议集合)四

通常BT客户端每几分钟就要向tracker发送一次请求.对于一些比较大的BT站点,其tracker的压力是可想而知的.降低tracker的压力首先考虑到的当然是采用更低网络开销的udp协议.于是Bittorrent udp-tracker protocol应运而生.   这个协议很简单.   下面是实现它的封装类:  // UDPTrackerClient.h: interface f

785

BitTorrent 协议规范(BT协议集合)十六

PiecePicker 用于实现“片断选择算法”,片断选择算法在《Incentives Build Robustness in BitTorrent》一文中有介绍,我把相关内容列出来。 BT的片断选择算法,综合下面几种策略。 l       严格的优先级   片断选择的第一个策略是:一旦请求了某个片断的子片断,那么该片断剩下的子片断优先被请求。这样,可以尽可能快的获得一个完整的片断 l      

852
上一篇: BitTorrent 协议规范(BT协议集合)二十
下一篇: BitTorrent 协议规范(BT协议集合)二二
Pregunta
博客等级 码龄23年 6粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值