以下代码利用libtorrent实现了BT客户端程序,需要包含boost库和libtorrent库

具体使用如下:

ltclient.exe e:\5DE0513D406C65FEA074E39CD4B98A7F16816C86.torrent e:\download\xyz\

exe + torrent  + savepath

// ltclient.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//#include "pch.h"
#include <iostream>
#include "libtorrent\entry.hpp"
#include "libtorrent\bencode.hpp"
#include "libtorrent\session.hpp"
#include "libtorrent\torrent_info.hpp"
#include <libtorrent\alert_types.hpp>
#include <libtorrent\torrent_status.hpp>
#include <chrono>using namespace std;
using namespace chrono;
static int count;
INT64 downloadsize = 0;char const* state(lt::torrent_status::state_t s)
{switch (s) {case lt::torrent_status::checking_files: return "checking";case lt::torrent_status::downloading_metadata: return "dl metadata";case lt::torrent_status::downloading: return "downloading";case lt::torrent_status::finished: return "finished";case lt::torrent_status::seeding: return "seeding";case lt::torrent_status::allocating: return "allocating";case lt::torrent_status::checking_resume_data: return "checking resume";default: return "<>";}
}
// return the name of a torrent status enum
bool handle_alter(lt::session& ses, lt::alert* a, lt::torrent_handle &th)
{using namespace lt;if (add_torrent_alert *p = alert_cast<add_torrent_alert>(a)){if (p->error){std::fprintf(stderr, "failed to add torrent:%s %s\n",p->params.ti?p->params.ti->name().c_str():p->params.name.c_str(),p->error.message().c_str());}}else if (torrent_finished_alert *p = alert_cast<torrent_finished_alert>(a)){cout << "torrent finished" << endl;}else if (state_update_alert *p = alert_cast<state_update_alert>(a)){char cinfo[1024] = { 0x00 };std::vector<std::int64_t> file_progress;th.file_progress(file_progress); // 获取文件下载进度int const idx = static_cast<int>(0);if(!p->status.empty()){ lt::torrent_status s = th.status(lt::torrent_handle::query_save_path);//lt::torrent_status s = p->status[0];//如果只有一个torrent文件,就直接取status[0]//sprintf_s(cinfo, sizeof(cinfo), "%s download rate %dKB /s, total_download %dKB, uprate %dKB /s, total_up %dKB, progress %.1lf, progress_ppm %lld progress %lld%%  %d%%"//, state(s.state),s.download_payload_rate/1000, s.total_done/1000, s.upload_rate/1000, s.total_upload/1000, s.progress, s.progress_ppm, int(s.progress_ppm/10000), file_progress[0]*100 / downloadsize);cout << state(s.state) << " download rate " << s.download_payload_rate / 1000 << "KB /s, total_download " << s.total_done / 1000 << "KB, uprate " << s.upload_rate / 1000 << "KB /s, total_up " << s.total_upload / 1000<< "KB, progress " << s.progress << " progress_ppm " << s.progress_ppm << " progress " << s.progress_ppm / 10000 << "  " << file_progress[0] * 100 / downloadsize << endl;//sprintf_s(cinfo, "%s download rate %dKB /s, total_download %dKB, uprate %dKB /s, total_up %dKB, curdown %lld, filesize %lld, downprogress %lld%%"// , state(s.state), s.download_payload_rate / 1000, s.total_done / 1000, s.upload_rate / 1000, s.total_upload / 1000, file_progress[0], downloadsize, file_progress[0] * 100 / downloadsize);cout << cinfo << endl;std::cout.flush();//lt::torrent_status st = th.status(lt::torrent_handle::query_save_path);//std::cout << "\r" << state(st.state) << " "//  << (st.download_payload_rate / 1000) << " kB/s "//    << (st.total_done / 1000) << " kB ("//    << (st.progress_ppm / 10000) << "%) downloaded";//std::cout.flush();}}return true;
}int suxy(int x, int y);
int main(int argc, char ** argv)
try
{cout << ::count << endl;if (argc < 3){std::cerr << "uage: ltclient torrent-file  path\n";return 1;}int nTimedOut = 2000; //设置下载超时时间std::string save_path(".\\");//保存文件路径int torrent_upload_limit = 100000 * 1000; //上传速度限制int torrent_download_limit = 100000*1000; //下载速度限制 单位是字节//BT下载客户端代码lt::settings_pack pack;pack.set_int(lt::settings_pack::alert_mask, lt::alert::error_notification| lt::alert::storage_notification| lt::alert::status_notification);pack.set_str(lt::settings_pack::user_agent, "ltclient/""test");lt::session ses(pack);//设置下载参数lt::add_torrent_params params;//params.save_path = save_path;params.save_path = argv[2];params.ti = std::make_shared<lt::torrent_info>(argv[1]);params.download_limit = torrent_download_limit;params.upload_limit = torrent_upload_limit;auto start = system_clock::now();lt::torrent_handle th = ses.add_torrent(params);static auto end = system_clock::now();static auto duration = duration_cast<microseconds>(end - start);;while (true){//*************************************************************************//std::thread printprogress([&ses,th]//{// lt::torrent_status st = th.status(lt::torrent_handle::query_save_path);//  std::cout << "\r" << state(st.state) << " "//     << (st.download_payload_rate / 1000) << " kB/s "//        << (st.total_done / 1000) << " kB ("//        << (st.progress_ppm / 10000) << "%) downloaded";//    std::cout.flush();//});////printprogress.join();//***********************************************************************downloadsize = params.ti->files().file_size(0); //下载文件的总大小std::vector<lt::alert*> alerts;ses.pop_alerts(&alerts);for (auto a : alerts){//if (::handle_alter(ses, a, th))//{//    continue;//}::handle_alter(ses, a, th);}std::vector<std::int64_t> file_progress;th.file_progress(file_progress); // 获取文件下载进度int const idx = static_cast<int>(0);bool const complete = file_progress[idx] == downloadsize; //判断文件是否下载完成if (complete){ses.post_torrent_updates();cout << "\ndownload is complete" << endl;break;}end = system_clock::now();duration = duration_cast<microseconds>(end - start);if ((double(duration.count())*microseconds::period::num / microseconds::period::den) > 100 && file_progress[idx] == 0){cout << "download failed,check" << endl;break;}if ((double(duration.count())*microseconds::period::num / microseconds::period::den) > nTimedOut)//判断是否超时{cout << "download timed out" << endl;break;}//std::this_thread::sleep_for(std::chrono::microseconds(3000));ses.post_torrent_updates();}std::string title = params.ti->files().file_name(0).to_string();cout << "download "<<title<<" cost " << double(duration.count())*microseconds::period::num / microseconds::period::den<<"s"<<endl;while (1){char c = getchar();if (c == 'p')break;}return 0;
}
catch (std::exception const &e) {std::cerr << "ERROR: " << e.what() << "\n";
}// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单// 入门提示:
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件

源码附带库文件:

https://download.csdn.net/download/jiangyingfeng/11285780

libtorrent实现bt客户端程序相关推荐

  1. rtorrent - 强大的命令行BT客户端

    rtorrent - 强大的命令行BT客户端 NOTE - 文中展示的所有示例和指令都已经在Ubuntu 13.04中测试过. 一.           安装 [root@GY-10000 data] ...

  2. bt解析 开源 java_开源一个BT客户端:BitWave

    BitWave的Host: 源码放在github上,采用NEW BSD LICENSE发布.地址:https://github.com/airtrack/bitwave 写BitWave起因 去年买新 ...

  3. 将BT进行到底-BT客户端工具全收集

    http://www.pconline.com.cn/download/zhuanti/btindex.htm 将BT进行到底-BT客户端工具全收集 引言:使用FTP或者HTTP方式下载软件的时候,我 ...

  4. 使用 acl 库编写发送邮件的客户端程序

    2019独角兽企业重金招聘Python工程师标准>>> 邮件做为最早和最广的互联应网用之一,已经与人们的生活息息相关.我们虽然经常使用 Outlook Express/Outlook ...

  5. 基于XMPP的IOS聊天客户端程序(XMPP服务器架构)

    最近看了关于XMPP的框架,以文本聊天为例,需要发送的消息为: <message type="chat" from="kang@server.com" t ...

  6. TCP 客户端程序开发

    TCP 客户端程序开发 1. 开发 TCP 客户端程序开发步骤回顾 创建客户端套接字对象 和服务端套接字建立连接 发送数据 接收数据 关闭客户端套接字 2. socket 类的介绍 导入 socket ...

  7. java gui 怎么添加背景图片_三分钟教你学会用java写客户端程序!!速进!!

    写了这么多期的代码, 一直都是在控制台里面, 都没有像别的软件那样, 可以有一个桌面客户端的形式, 可以用鼠标点, 用键盘输入. 下面我们就来看看, 怎么用Java写一个客户端程序. 开局还是我们熟悉 ...

  8. c#实现客户端程序自动下载更新(单独程序)

    首先,自己工作需要实现客户端程序的自动更新下载,下面简单介绍自己实现逻辑和遇到的一些问题及解决方法 信息基本都是通过XML文件配置的,下文本地需要更新的程序简称为主程序 实现步骤简介: 1.获取本地程 ...

  9. 请教如何改善C#中socket通信机客户端程序的健壮性

    请教如何改善c#中socket通信机客户端程序的健壮性 我是做socket的新手,最近做了一个socket客户端程序,连接server的时候,如果server存在,并且允许连接的话,程序无错,正常执行 ...

  10. php编写TCP服务端和客户端程序

    From: http://blog.csdn.net/anda0109/article/details/46655301 1.修改php.ini,打开extension=php_sockets.dll ...

最新文章

  1. docker安装redis提示没有日记写入权限_Docker 学习笔记(第六集:使用 Dockerfile 定制镜像)...
  2. 树莓派搭建 DNS 服务器 | 树莓派小无相系列
  3. 抢票软件原理_手机部应届生软件大赛 | SHOW MI YOUR CODE
  4. 14-CoreData兼容iOS9和iOS10
  5. 深度学习(十五)基于级联卷积神经网络的人脸特征点定位
  6. SpringBoot2.1.15(26) WebFlux快速上手——响应式Spring的道法术器
  7. 关于单细胞批次矫正那些事(二) KBET 用于单细胞批次矫正结果的评估
  8. poj 2594 Treasure Exploration 匈牙利二分匹配+floyd
  9. P1018 乘积最大(高精度加/乘)
  10. .NET 2.0中的企业库异常处理块
  11. 数字信号处理实验(MATLAB)
  12. 微信历史消息java_微信聊天机器人[过年防信息轰炸、自动回复拜年消息]
  13. 精选机器学习深度学习视频资源合集 !(附下载链接)
  14. bi 工具 市场排行榜_国产移动BI工具排名
  15. 浙江2段线能上什么计算机学校,二段线考生看过来!这些浙江省内热门高校还有热门专业可捡漏...
  16. 北京航空航天大学计算机学院保研率,北京航空航天大学计算机学院(专业学位)计算机技术保研夏令营...
  17. Java迷宫小游戏,老程序员花一天时间完成,你可以吗?
  18. 2018级《程序设计基础(B)II》期末上机考试( 题解)
  19. java 下载文件的文件名乱码_JAVA 文件下载时的文件名乱码解决
  20. 计算机二级选择题瞎蒙,一级消防员考试,一级消防员考试题大全

热门文章

  1. ps6人脸识别液化工具在哪_Photoshop教学:人脸识别液化功能介绍
  2. Silvaco TCAD仿真2——Silvaco TCAD 档名
  3. playsound报错
  4. pwm控制直流电机转速流程图_一例PWM直流电机转速控制器的电路图,附电路原理分析...
  5. 条码软件如何将标签文件输出为PDF文档
  6. JAVA垃圾回收器与垃圾回收算法
  7. 全民斩仙2怎么在电脑上玩 全民斩仙2电脑版玩法教程
  8. 向日葵深度linux,完美使用向日葵远程软件
  9. 基于双二阶广义积分器(DSOGI)的软件锁相环需求的根源及s域仿真
  10. web第三课html课堂笔记