以下内容是基于libtorren-rasterbar-0.15.10版本的内容进行讲解的。
选片流程的核心操作应该是包含在policy.hpp.cpp和piece_picker.hpp.cpp文件中的。piece_picker中进行的操作在是数据片队列以及数据块这一层进行的;而policy这一层进行的工作则要考虑一些全局的东西在里面,也可以说是进行piece_picker工作的外层包装。
就目前的认识程度来看,选片流程的核心函数至少有两个:request_a_block(..)(在policy.hpp.cpp中) 和 pick_pieces(..)(在piece_picker.hpp.cpp中)。
进入选片核心操作的函数调用方式有两类,一类是通过调用peer_is_interesting函数来进一步调用request_a_block,另一类是直接调用request_a_block。第一类调用方式包括update_interest, incoming_have, incoming_bitfield, incoming_have_all等处理函数,第二类调用方式包括incoming_unchoke, incoming_piece等处理函数。至于update_interest, incoming_piece等数据片的获取工作循环的相关内容不作为这里的讲解内容。
约定:torrent-下载实例,peer_connection-链接实例,piece_picker-选片实例,policy-策略实例。
接下来我们简单讲解request_a_block函数(作为参考,可能存在理解上的偏差):
0)具体的数据检查和状态检查这里略过不提;
1)考虑到节点间在具体的数据传输过程中是以数据块(数据片的子单位)为单位进行的