bittorrent 学习(四) tracker peer通讯
看看 tracker.c文件
http_encode() 为http发送进行编码转换
int http_encode(unsigned char *in,int len1,char *out,int len2)
{
int i, j;
char hex_table[] = "0123456789abcdef"; if( (len1 != ) || (len2 <= ) ) return -;
for(i = , j = ; i < ; i++, j++) {
if( isalpha(in[i]) || isdigit(in[i]) )
out[j] = in[i];
else {
out[j] = '%';
j++;
out[j] = hex_table[in[i] >> ];
j++;
out[j] = hex_table[in[i] & 0xf];
}
}
out[j] = '\0'; #ifdef DEBUG
//printf("http encoded:%s\n",out);
#endif return ;
}
get_tracker_name() 通过截取关键字符 获取网址的名称部分
int get_tracker_name(Announce_list *node,char *name,int len)
{
int i = , j = ; if( (len < ) || (node == NULL) ) return -;
if( memcmp(node->announce,"http://",) == )
i = i + ;
while( (node->announce[i] != '/') && (node->announce[i] != ':') ) {
name[j] = node->announce[i];
i++;
j++;
if( i == strlen(node->announce) ) break;
}
name[j] = '\0'; #ifdef DEBUG
printf("%s\n",node->announce);
printf("tracker name:%s\n",name);
#endif return ;
}
get_tracker_port() 通过截取关键字符 获取端口部分
int get_tracker_port(Announce_list *node,unsigned short *port)
{
int i = ; if( (node == NULL) || (port == NULL) ) return -;
if( memcmp(node->announce,"http://",) == ) i = i + ;
*port = ;
while( i < strlen(node->announce) ) {
if( node->announce[i] != ':') { i++; continue; } i++; // skip ':'
while( isdigit(node->announce[i]) ) {
*port = *port * + (node->announce[i] - '');
i++;
}
break;
}
if(*port == ) *port = ; #ifdef DEBUG
printf("tracker port:%d\n",*port);
#endif return ;
}
create_request()创建一个http的请求
int create_request(char *request,int len,Announce_list *node,
unsigned short port,long long down,long long up,
long long left,int numwant)
{
char encoded_info_hash[];
char encoded_peer_id[];
int key;
char tracker_name[];
unsigned short tracker_port; http_encode(info_hash,,encoded_info_hash,);
http_encode(peer_id,,encoded_peer_id,); srand(time(NULL));
key = rand() / ; get_tracker_name(node,tracker_name,);
get_tracker_port(node,&tracker_port); sprintf(request,
"GET /announce?info_hash=%s&peer_id=%s&port=%u"
"&uploaded=%lld&downloaded=%lld&left=%lld"
"&event=started&key=%d&compact=1&numwant=%d HTTP/1.0\r\n"
"Host: %s\r\nUser-Agent: Bittorrent\r\nAccept: */*\r\n"
"Accept-Encoding: gzip\r\nConnection: closed\r\n\r\n",
encoded_info_hash,encoded_peer_id,port,up,down,left,
key,numwant,tracker_name); #ifdef DEBUG
printf("request:%s\n",request);
#endif return ;
}
get_response_type() 分析返回的内容 确认返回内容的类型
int get_response_type(char *buffer,int len,int *total_length)
{
int i, content_length = ; for(i = ; i < len-; i++) {
if(memcmp(&buffer[i],"5:peers",) == ) {
i = i+;
break;
}
}
if(i == len-) return -; // 返回的消息不含"5:peers"关键字
if(buffer[i] != 'l') return ; // 返回的消息的类型为第一种 *total_length = ;
for(i = ; i < len-; i++) {
if(memcmp(&buffer[i],"Content-Length: ",) == ) {
i = i+;
break;
}
}
if(i != len-) {
while(isdigit(buffer[i])) {
content_length = content_length * + (buffer[i] - '');
i++;
}
for(i = ; i < len-; i++) {
if(memcmp(&buffer[i],"\r\n\r\n",) == ) { i = i+; break; }
}
if(i != len-) *total_length = content_length + i;
} if(*total_length == ) return -;
else return ;
}
代码都比较清晰易懂 划分明确
以上所有都是为了peer之间的通讯做准备 peer间的通讯流程如下


参考
《linux C编程实战》
bittorrent 学习(四) tracker peer通讯的更多相关文章
- TweenMax动画库学习(四)
目录 TweenMax动画库学习(一) TweenMax动画库学习(二) TweenMax动画库学习(三) Tw ...
- SVG 学习<四> 基础API
目录 SVG 学习<一>基础图形及线段 SVG 学习<二>进阶 SVG世界,视野,视窗 stroke属性 svg分组 SVG 学习<三>渐变 SVG 学习<四 ...
- Android JNI学习(四)——JNI的常用方法的中文API
本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Nati ...
- SCARA——OpenGL入门学习四(颜色)
OpenGL入门学习[四] 本次学习的是颜色的选择.终于要走出黑白的世界了~~ OpenGL支持两种颜色模式:一种是RGBA,一种是颜色索引模式. 无论哪种颜色模式,计算机都必须为每一个像素保存一些数 ...
- ZigBee学习四 无线+UART通信
ZigBee学习四 无线+UART通信 1) 协调器编程 修改coordinator.c文件 byte GenericApp_TransID; // This is the unique messag ...
- (转)SpringMVC学习(四)——Spring、MyBatis和SpringMVC的整合
http://blog.csdn.net/yerenyuan_pku/article/details/72231763 之前我整合了Spring和MyBatis这两个框架,不会的可以看我的文章MyBa ...
- Spring Boot 项目学习 (四) Spring Boot整合Swagger2自动生成API文档
0 引言 在做服务端开发的时候,难免会涉及到API 接口文档的编写,可以经历过手写API 文档的过程,就会发现,一个自动生成API文档可以提高多少的效率. 以下列举几个手写API 文档的痛点: 文档需 ...
- Expression Blend学习四控件
原文:Expression Blend学习四控件 Expression Blend制作自定义按钮 1.从Blend工具箱中添加一个Button,按住shift,将尺寸调整为125*125; 2.右键点 ...
- day 83 Vue学习四之过滤器、钩子函数、路由、全家桶等
Vue学习四之过滤器.钩子函数.路由.全家桶等 本节目录 一 vue过滤器 二 生命周期的钩子函数 三 vue的全家桶 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 Vue的过滤 ...
随机推荐
- oo 第一次博客作业
oo 第一次博客作业 早在大一就听说了oo的各种传奇故事,大二下学期终于也开始了我的oo之旅. 基于度量来分析自己的程序结构 第一次作业 类图分析 耦合度分析 可以看出在第一次作业中,我的耦合度非常高 ...
- spring boot 接口返回值去掉为null的字段
现在项目都是前后端分离的,返回的数据都是使用json,但有些接口的返回值存在 null或者"",这种字段不仅影响理解,还浪费带宽,需要统一做一下处理,不返回空字段,或者把NULL转 ...
- matlab-逻辑回归二分类(Logistic Regression)
逻辑回归二分类 今天尝试写了一下逻辑回归分类,把代码分享给大家,至于原理的的话请戳这里 https://blog.csdn.net/laobai1015/article/details/7811321 ...
- Vue 自定义指令实现权限控制(按钮级)
在用户登陆后,根据用户id读取用户的所有权限数据,放入本地的sessionStorage进行存储(这里我是拿到权限按钮按钮的标识,英文名称.把他们合成一个字符串存储在 btnPowerString 中 ...
- “帮你”APP——NABCD需求分析
1.你的创意解决了用户的什么需求?(N) 本学校已存在的失物招领.表白墙.二手市场等QQ群普遍存在信息冗杂,时效性差等缺点.不能充分发挥信息有效性的,我们的“帮你”APP能够充分发挥信息的有效性,让失 ...
- python 打开文件基础 (笔记)
1.打开文件:建立文件与程序的关联 open(filenname,mode) filenname:文件名(包括路径):mode :打开模式 模式 打开模式 含义 r 只读,文件不存在则报错 w 只写, ...
- [INet] I/O模型:同步阻塞,同步非阻塞,异步非阻塞
POSIX 把这同步.异步两个术语定义 如下: 同步 I/O 操作( synchronous I/O opetation) 导致请求进程阻塞, 直到 I/O 操作完成: 异步 I/O 操作( asyn ...
- rem_750
/* fix the code flash the page */ var globalWidth = document.documentElement.clientWidth;//window.in ...
- MVC生成页码选择器返回HTML代码
我主要讲此代码用于MVC的分布页. 先看最终效果最终效果: 样式为bootstrap3中的分页“pagination”,如果不使用bootstrap单独提出来并不大 页码生成代码为: public s ...
- PeopleSoft查看所有translate value
下面sql可以列出PS中所有translate value SELECT FIELDNAME, FIELDVALUE, EFFDT, EFF_STATUS, XLATLONGNAME, XLATSHO ...