开源BT客户端程序arctic代码阅读笔记

arctic 是一个基于C++的libtorrent的BT客户端开源项目,arctic的界面比较简单,它主要关注的是低内存的消耗和性能的提升。项目使用了boost C++库,LibTorrent库,zlib库。主要研究的核心是LibTorrent库。arctic界面没有使用MFC,而是直接使用的Windows API开发的界面。

 

开源BT客户端程序arctic代码阅读笔记_第1张图片

 

arctic 代码结构如图:

开源BT客户端程序arctic代码阅读笔记_第2张图片 开源BT客户端程序arctic代码阅读笔记_第3张图片

 

代码编译需要有boost C++库,网上有很多关于使用和编译boost c++库的教程,编译和安装好boost后需要在VS2008的option->projects and solutions->VC++ Directories 添加boost的includes和libs目录。

 

在arctic界面代码中,主要是下面这个AddTorrent函数调用libtorrent库进行下载动作。

static void AddTorrent(HWND hwnd, path file) { try { const path rfile=getmodulepath()/"resume"/file; libtorrent::entry metadata=bdecode(file); // 从torrent文件中获取元数据 libtorrent::entry resumedata; if(boost::filesystem::exists(rfile)) { try { resumedata=bdecode(rfile.leaf()); } catch(...) { wchar_t text[256], title[128]; LoadString(GetModuleHandle(NULL), IDS_RESUMEERR, title, 128); LoadString(GetModuleHandle(NULL), IDS_RESUMEERRTEXT, text, 256); MessageBox(hwnd, text, title, MB_ICONERROR|MB_OK); boost::filesystem::remove(rfile); } } if(!boost::filesystem::exists(getmodulepath()/"torrents")) boost::filesystem::create_directory(getmodulepath()/"torrents"); if(!boost::filesystem::exists(getmodulepath()/"torrents"/file.leaf())) boost::filesystem::copy_file(file, getmodulepath()/"torrents"/file.leaf()); if(!boost::filesystem::exists(conf.savepath)) boost::filesystem::create_directory(conf.savepath); vector<libtorrent::torrent_handle>::size_type i=torrents.size(); Torrent t; // 新建一个Torrent对象 t.file=file.leaf(); // Torrent 文件名,不包含path t.handle=session->add_torrent(metadata, conf.savepath, resumedata);// 将种子添加到当前会话session的种子列表中,应该 // 要启动线程开始这个Torrent文件中数据的下载和上传工作 t.handle.set_max_uploads(conf.maxup); // 最大上传数目 t.handle.set_max_connections(conf.maxcon);// 最大连接数目 const libtorrent::torrent_info &info=t.handle.get_torrent_info(); // 获取Torrent文件中的信息 t.cols[0]=mbstowcs(info.name()); // 字符串编码转换 t.cols[1]=strsize((double)info.total_size()); torrents.push_back(t); // 将Torrent对象t添加到Torrent列表中 sort(torrents.begin(), torrents.end()); if(allpaused) t.handle.pause(); HWND list=GetDlgItem(hwnd, IDC_LIST); ListView_SetItemCount(list, torrents.size()); } catch(exception &ex) { wstring text=mbstowcs(ex.what()); wstring caption=loadstring(IDS_EXCEPTION); MessageBox(hwnd, text.c_str(), caption.c_str(), MB_ICONERROR|MB_OK); } }

 

libtorrent库的主要的类:

Session: 整个应用程序所有的链接会话管理的类

Policy: 下载策略的实现类,使用tit-for-tat激励机制

Torrent: 维护一个特定的下载任务

Torrent_handle: 调用类的成员函数

Torrent_info: 读取和写入种子文件的信息

Peer-connection: 对等连接

Storage: 磁盘存储管理

......

还有若干类,暂时没有仔细了解

 

初读arctic源代码,总结如上,有不对的,欢迎批评指正。

 

你可能感兴趣的:(exception,list,ListView,session,File,BT)