关于tracker和tracker manager

tracker在整个bt协议中起着很重要的作用,从tracker那里我们可以获取当前正在下载的peer列表,从而与它们交互,进行文件的上传和下载。TrackerManager顾名思义就是管理tracker的。因为可能有多个tracker,所以采用了trackermanager进行管理,所以也显得比较有条理些。

tracker类的实现

本程序中只实现了TCP tracker,UDP tracker一直苦于没有找到可供测试的torrent文件。所以没实现。tracker类负责与服务器进行交互,获取正在下载的peer列表,主要实现在update函数中。

void CTCPTracker::Update()
{CURL *pHandle = curl_easy_init();m_strTrackerResponse.clear();m_nTrackerState = TS_CONNECTING;m_nCurrentEvent = GetCurrentEvent();string strURL = GenTrackerURL(Event2Str(m_nCurrentEvent));curl_easy_setopt(pHandle, CURLOPT_URL, strURL.c_str());curl_easy_setopt(pHandle, CURLOPT_WRITEFUNCTION, OnRecvData);curl_easy_setopt(pHandle, CURLOPT_WRITEDATA, this);curl_easy_setopt(pHandle, CURLOPT_FOLLOWLOCATION, 1);curl_easy_setopt(pHandle, CURLOPT_NOSIGNAL, 1);curl_easy_setopt(pHandle, CURLOPT_TIMEOUT, 60);CURLcode nRetCode = curl_easy_perform(pHandle);if (nRetCode == CURLE_OK){ParseTrackerResponse();}else{m_nTrackerState = TS_ERROR;m_llNextUpdateTick = GetTickCount() + 15 * 1000;}curl_easy_cleanup(pHandle);
}

之前使用纯socket编程连接tracker服务器,发行总是连不上,所以改用libcurl,这个东西确实太方便了。用起来太舒服了。关于libcurl,这里就不作介绍了。

TrackerManager实现

trackermanager主要做了以下两件重要的事情:
(1)根据种子文件中的tracker列表创建tracker。

void CTrackerManager::CreateTrackers()
{vector<string> vecAnnouce = m_pTorrentTask->GetTorrentFile()->GetAnnounceList();vector<string>::iterator it = vecAnnouce.begin();for (; it != vecAnnouce.end(); ++it){ITracker *pTracker = NULL;int nStart = 0;int nEnd = 0;if (CTorrentParser::FindPattern((*it).c_str(), "HTTP:", nStart, nEnd) == true ||CTorrentParser::FindPattern((*it).c_str(), "http:", nStart, nEnd) == true){pTracker = new CTCPTracker;}if (pTracker != NULL){pTracker->SetURL((*it).c_str());pTracker->SetTrackerManager(this);m_vecTrackers.push_back(pTracker);}}
}

目前这里只处理了http类型的tracker,采用正则表达式来提取tracker信息。以后会继续完善。
(2)在一个线程中,让tracker各自的更新,拉取最新的peer列表。

void CTrackerManager::Svc()
{while(!m_bExit){vector<ITracker *>::iterator it = m_vecTrackers.begin();for (; it != m_vecTrackers.end(); ++it){if (m_bExit){break;}if (GetTickCount() < (*it)->GetNextUpdateTick()){continue;}(*it)->Update();}usleep(150000);}
}

里面最重要的就是各个tracker的Update。
程序源代码下载地址:http://download.csdn.net/detail/zxywd/9415711

一个简单的BitTorrent客户端实现(五):tracker manager和tracker实现相关推荐

  1. 一个简单的BitTorrent客户端实现(六):peer manager和peer实现

    peer manager和peer peer是整个BT通信中最复杂的部分,主要是里面各种消息的发送和一些choke和unchoke策略,piece选择策略等等.peer manager用于管理peer ...

  2. 一个简单的BitTorrent客户端实现(二):种子文件解析及信息保存

    关于种子文件 BT的种子文件一般是以.torrent作为后缀的.关于种子文件的编码,这里不再做任何介绍.本程序采用的测试种子文件为ubuntu-14.04.3-desktop-i386.torrent ...

  3. 制作一个简单的新闻客户端

    前面的博客中介绍了在Android中实现网络通信,这篇博客将是对前面介绍的技术的一个综合运用,制作一个简单的新闻客户端,在这个新闻客户端中用到了ListView.ListView的优化.使用开源框架访 ...

  4. java 客户端 tcp_一个简单的Tcp客户端

    一个简单的Tcp客户端 import java.io.InputStream; import java.net.InetAddress; import java.net.Socket; public ...

  5. Golang实现一个简单的FTP客户端

    使用Golang语言实现的一个简单的FTP客户端:Github源码:Golang实现一个简单的FTP客户端

  6. libhv教程13--创建一个简单的WebSocket客户端

    文章目录 WebSocket简介 WebSocket 产生背景 WebSocket 的定义 WebSocket 握手过程 WebSocket 通信协议 示例代码 js示例代码 c++示例代码 WebS ...

  7. 如何用JAVA写一个简单的电脑客户端应用

    前言: 我们学习了JAVA的application和applet,其中applet是需要打开编译软件或命令行才能弹出的那种窗口,和我们平时可以下载的软件不太一样.如何开发一个.exe文件? 其实和写正 ...

  8. 一个简单的Android客户端从服务器端获取json数据并解析的实现代码

    今天总结一下android客户端从服务器端获取json数据的实现代码,需要的朋友可以参考下 首先客户端从服务器端获取json数据 1.利用HttpUrlConnection 复制代码代码如下: /** ...

  9. 一个简单光栅器的实现(五) 光栅化阶段

    在几何阶段我们通过顶点变换获得了世界坐标下的顶点最终渲染到屏幕上的位置和它们的深度值,并且在剔除掉了不在视锥体内顶点,接下来要做的就是根据顶点的位置和三角形索引渲染出模型的每一个三角形. 这个简单的光 ...

最新文章

  1. 生成xml_Java操作XML
  2. android 工信部偷跑流量
  3. vs release 调试 路径设置
  4. PHP进阶学习之依赖注入与Ioc容器详解
  5. java 数据 权限_Java如何利用Mybatis进行数据权限控制详解
  6. getpass函数简单使用
  7. 【数学建模】基于matlab细胞传输模型实现交通流【含Matlab源码 376期】
  8. linux系统服务器关机命令,linux系统中有哪些关机命令
  9. 黑苹果hd3000显存3m_加装黑苹果生产力翻倍,E3 神机规模升级再战五年
  10. 人生哲理 之 驴子的故事
  11. 网上流传房地产崩盘时间表 楼市重蹈日本覆辙 - 新闻中心 - 搜狐焦点网
  12. html图片滤色,CSS3图片混合(Blend)效果详解
  13. 神兽麒麟kylin驾驭指南
  14. anz的swift code_澳洲Commonwealth bank是不是只有一个SWIFT CODE?
  15. python-基于yagmail库开发自动邮件发送程序
  16. Spring Boot 基础教程:集成 Knife4j
  17. 新一代杂志新一代杂志社新一代编辑部2022年第13期目录
  18. 数据结构(使用头插法实现单链表)
  19. android 打开微信好友动态,朋友圈可以查看“访客记录”?微信8.0.1不简单,新功能大解析...
  20. LeetCode题解:x的平方根

热门文章

  1. excel去除重复处理
  2. 输入框采用自动填充数据后,变成浅黄色背景
  3. 【Activiti工作流】5. 简单请假流程
  4. adb连接夜神模拟器和连接夜神多开的方法
  5. FFmpeg c++ 报错合集
  6. 玻尔兹曼机、深度信念网络、编码器等生成模型
  7. 计算机视觉算法与应用 英文pdf,计算机视觉:算法与应用(套装共2册) [Computer Vision:Algorithms and Applications]...
  8. 封装实现电子宠物系统的企鹅类正确输入健康值和亲密度
  9. 简单笔记本无线热点开启
  10. C# EMS Client