SimpleTorrent
|
操作全局信息的相关 API 实现 更多...
#include "metainfo.h"
#include "bparser.h"
#include "butil.h"
#include "peer.h"
#include "connect.h"
#include "util.h"
#include <string.h>
#include <openssl/sha.h>
#include <netinet/in.h>
函数 | |
void | free_metainfo (struct MetaInfo **pmi) |
释放全局信息 | |
void | extract_trackers (struct MetaInfo *mi, const struct BNode *ast) |
提取 tracker 列表 更多... | |
void | metainfo_load_file (struct MetaInfo *mi, const struct BNode *ast) |
获取文件名,读取文件,分析已经完成的块 | |
void | extract_pieces (struct MetaInfo *mi, const struct BNode *ast) |
提取分片 hash 更多... | |
void | add_peer (struct MetaInfo *mi, struct Peer *p) |
增加一个 peer 更多... | |
void | del_peer_by_fd (struct MetaInfo *mi, int fd) |
根据连接套接字删除 peer 更多... | |
struct Peer * | get_peer_by_fd (struct MetaInfo *mi, int fd) |
根据连接套接字搜索 peer 更多... | |
struct Peer * | get_peer_by_addr (struct MetaInfo *mi, uint32_t addr, uint16_t port) |
根据网络地址搜索 peer 更多... | |
int | check_substate (struct MetaInfo *mi, int index) |
检查某一分片的子分片状态并打印 更多... | |
struct Tracker * | get_tracker_by_fd (struct MetaInfo *mi, int sfd) |
根据连接套接字找 tracker 更多... | |
struct Tracker * | get_tracker_by_timer (struct MetaInfo *mi, int timerfd) |
根据定时器描述符找 tracker 更多... | |
void | add_wait_peer (struct MetaInfo *mi, int fd, uint32_t addr, uint16_t port) |
添加等待 peer, 网络字节序 | |
int | get_wait_peer_index_by_fd (struct MetaInfo *mi, int fd) |
根据套接字找到 peer 下标 更多... | |
int | find_wait_peer_fd_by_addr (struct MetaInfo *mi, uint32_t addr, uint16_t port) |
根据地址找到 peer 的套接字,网络字节序 更多... | |
void | rm_wait_peer (struct MetaInfo *mi, int index) |
删除等待 peer 更多... | |
操作全局信息的相关 API 实现
增加一个 peer
mi | 全局信息 |
p | 要加入的 peer, 要求是动态分配的. |
int check_substate | ( | struct MetaInfo * | mi, |
int | index | ||
) |
检查某一分片的子分片状态并打印
打印符号说明:
mi | 全局信息 |
index | 分片号 |
void del_peer_by_fd | ( | struct MetaInfo * | mi, |
int | fd | ||
) |
根据连接套接字删除 peer
被删除的指针空闲没有回收, 在未来增加新 peer 时靠 realloc 重新尾部的冗余空间.
提取分片 hash
mi | 全局信息 |
ast | B 编码语法树 |
提取 tracker 列表
观察实际的种子文件, 发现如果有 announce-list, 那么 announce 往往是其中的第一项. 但是 announce-list 本身 不是必须的, 所以在没有 announce-list 是解析 announce 否则直接使用 announce-list 忽略 announce.
int find_wait_peer_fd_by_addr | ( | struct MetaInfo * | mi, |
uint32_t | addr, | ||
uint16_t | port | ||
) |
根据地址找到 peer 的套接字,网络字节序
根据网络地址搜索 peer
参数的 addr 和 port 是网络字节序。 peer 自己的 addr 在构造时是网络字节序,但是 port 是本机字节序。
根据连接套接字搜索 peer
mi | 全局信息 |
fd | 连接套接字描述符 |
适用于 epoll 场景, 此时套接字描述符是最先确定的数据.
根据连接套接字找 tracker
适用于第一手信息是套接字的场合: epoll
mi | 全局信息 |
sfd | 连接套接字 |
根据定时器描述符找 tracker
定时事件是一个低频事件,所以这个函数在 EPOLLIN 事件里排在最后
mi | 全局信息 |
timerfd | 定时器描述符 |
int get_wait_peer_index_by_fd | ( | struct MetaInfo * | mi, |
int | fd | ||
) |
根据套接字找到 peer 下标
void rm_wait_peer | ( | struct MetaInfo * | mi, |
int | index | ||
) |
删除等待 peer
如果要删除的元素刚好是最后一个,只需要减少总数量就行了。