|
SimpleTorrent
|
操作全局信息的相关 API 声明 更多...
#include <stdio.h>#include <time.h>#include <inttypes.h>

结构体 | |
| struct | Tracker |
| 描述 tracker 的相关信息 更多... | |
| struct | PieceInfo |
| 分片信息 更多... | |
| struct | WaitPeer |
| 描述处于等待握手状态的 peer 信息 更多... | |
| struct | MetaInfo |
| 描述一次运行的全局信息 更多... | |
宏定义 | |
| #define | HASH_SIZE 20 |
| SHA1 HASH 的字节数 | |
| #define | SUB_NA 0 |
| #define | SUB_DOWNLOAD 1 |
| #define | SUB_FINISH 2 |
| #define | WAIT_THRESHOLD 10.0 |
函数 | |
| 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 声明
| #define SUB_DOWNLOAD 1 |
子分片下载中
| #define SUB_FINISH 2 |
子分片完成下载
| #define SUB_NA 0 |
子分片没有开始下载
| #define WAIT_THRESHOLD 10.0 |
子分片最长等待时间 10s
增加一个 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
| mi | 全局信息 |
| fd | 连接套接字描述符 |
被删除的指针空闲没有回收, 在未来增加新 peer 时靠 realloc 重新尾部的冗余空间.

提取分片 hash
| mi | 全局信息 |
| ast | B 编码语法树 |

提取 tracker 列表
| mi | 全局信息 |
| ast | B 编码语法树 |
观察实际的种子文件, 发现如果有 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
| mi | 全局信息 |
| addr | ip 地址,网络字节序 |
| port | 端口号,网络字节序 |
参数的 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
如果要删除的元素刚好是最后一个,只需要减少总数量就行了。

1.8.11