SimpleTorrent
函数
metainfo.c 文件参考

操作全局信息的相关 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>
metainfo.c 的引用(Include)关系图:

函数

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 Peerget_peer_by_fd (struct MetaInfo *mi, int fd)
 根据连接套接字搜索 peer 更多...
 
struct Peerget_peer_by_addr (struct MetaInfo *mi, uint32_t addr, uint16_t port)
 根据网络地址搜索 peer 更多...
 
int check_substate (struct MetaInfo *mi, int index)
 检查某一分片的子分片状态并打印 更多...
 
struct Trackerget_tracker_by_fd (struct MetaInfo *mi, int sfd)
 根据连接套接字找 tracker 更多...
 
struct Trackerget_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 实现

函数说明

void add_peer ( struct MetaInfo mi,
struct Peer p 
)

增加一个 peer

参数
mi全局信息
p要加入的 peer, 要求是动态分配的.

这是这个函数的调用关系图:

int check_substate ( struct MetaInfo mi,
int  index 
)

检查某一分片的子分片状态并打印

打印符号说明:

  1. . 已完成
  2. 0 正下载
  3. X 未下载
参数
mi全局信息
index分片号
返回
如果全部子分片完成返回 1, 否则返回 0.

这是这个函数的调用关系图:

void del_peer_by_fd ( struct MetaInfo mi,
int  fd 
)

根据连接套接字删除 peer

被删除的指针空闲没有回收, 在未来增加新 peer 时靠 realloc 重新尾部的冗余空间.

这是这个函数的调用关系图:

void extract_pieces ( struct MetaInfo mi,
const struct BNode ast 
)

提取分片 hash

参数
mi全局信息
astB 编码语法树

这是这个函数的调用关系图:

void extract_trackers ( struct MetaInfo mi,
const struct BNode ast 
)

提取 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 的套接字,网络字节序

返回
对应的套接字,没找到则 -1.

这是这个函数的调用关系图:

struct Peer* get_peer_by_addr ( struct MetaInfo mi,
uint32_t  addr,
uint16_t  port 
)

根据网络地址搜索 peer

参数的 addr 和 port 是网络字节序。 peer 自己的 addr 在构造时是网络字节序,但是 port 是本机字节序。

这是这个函数的调用关系图:

struct Peer* get_peer_by_fd ( struct MetaInfo mi,
int  fd 
)

根据连接套接字搜索 peer

参数
mi全局信息
fd连接套接字描述符
返回
找到时返回对应的 peer 指针, 否则返回 NULL.

适用于 epoll 场景, 此时套接字描述符是最先确定的数据.

这是这个函数的调用关系图:

struct Tracker* get_tracker_by_fd ( struct MetaInfo mi,
int  sfd 
)

根据连接套接字找 tracker

适用于第一手信息是套接字的场合: epoll

参数
mi全局信息
sfd连接套接字
返回
对应的 tracker 指针,没找到返回 NULL

这是这个函数的调用关系图:

struct Tracker* get_tracker_by_timer ( struct MetaInfo mi,
int  timerfd 
)

根据定时器描述符找 tracker

定时事件是一个低频事件,所以这个函数在 EPOLLIN 事件里排在最后

参数
mi全局信息
timerfd定时器描述符
返回
对应的 tracker 指针,没找到返回 NULL

这是这个函数的调用关系图:

int get_wait_peer_index_by_fd ( struct MetaInfo mi,
int  fd 
)

根据套接字找到 peer 下标

返回
对应的下标,没找到则 -1.

这是这个函数的调用关系图:

void rm_wait_peer ( struct MetaInfo mi,
int  index 
)

删除等待 peer

如果要删除的元素刚好是最后一个,只需要减少总数量就行了。

这是这个函数的调用关系图: