SimpleTorrent
metainfo.h
浏览该文件的文档.
1 
6 #ifndef METAINFO_H
7 #define METAINFO_H
8 
9 #include <stdio.h>
10 #include <time.h>
11 #include <inttypes.h>
12 
16 #define HASH_SIZE 20
17 
18 struct BNode;
19 
21 struct Tracker
22 {
23  char method[10];
24  char host[128];
25  char port[10];
26  char request[128];
27  int sfd;
28  int timerfd;
29 };
30 
32 #define SUB_NA 0
33 
34 #define SUB_DOWNLOAD 1
35 
36 #define SUB_FINISH 2
37 
38 #define WAIT_THRESHOLD 10.0
39 
51 struct PieceInfo
52 {
53  unsigned char hash[HASH_SIZE];
54  int nr_owners;
56 
57  unsigned char *substate;
58  time_t *subtimer;
59 };
60 
69 struct WaitPeer
70 {
71  int fd;
72  union {
73  uint32_t addr;
74  uint8_t ip[4];
75  };
76  uint16_t port;
77  int direction;
78 };
79 
86 struct MetaInfo
87 {
88  size_t file_size;
89  FILE *file;
90  unsigned char info_hash[HASH_SIZE];
91 
92  uint32_t piece_size;
93  size_t nr_pieces;
94  size_t bitfield_size;
95  uint32_t sub_size;
96  size_t sub_count;
97  struct PieceInfo *pieces;
98 
99  unsigned short port;
100  int listen_fd;
101  int timerfd;
102  int nr_peers;
103  struct Peer **peers;
106  size_t nr_trackers;
107  struct Tracker *trackers;
108 };
109 
111 void free_metainfo(struct MetaInfo **pmi);
112 
118 void extract_trackers(struct MetaInfo *mi, const struct BNode *ast);
119 
121 void metainfo_load_file(struct MetaInfo *mi, const struct BNode *ast);
122 
128 void extract_pieces(struct MetaInfo *mi, const struct BNode *ast);
129 
135 void add_peer(struct MetaInfo *mi, struct Peer *p);
136 
142 void del_peer_by_fd(struct MetaInfo *mi, int fd);
143 
152 struct Peer *get_peer_by_fd(struct MetaInfo *mi, int fd);
153 
160 struct Peer * get_peer_by_addr(struct MetaInfo *mi, uint32_t addr, uint16_t port);
161 
174 int check_substate(struct MetaInfo *mi, int index);
175 
185 struct Tracker *get_tracker_by_fd(struct MetaInfo *mi, int sfd);
186 
196 struct Tracker *get_tracker_by_timer(struct MetaInfo *mi, int timerfd);
197 
199 void add_wait_peer(struct MetaInfo *mi, int fd, uint32_t addr, uint16_t port);
200 
206 int get_wait_peer_index_by_fd(struct MetaInfo *mi, int fd);
207 
212 int find_wait_peer_fd_by_addr(struct MetaInfo *mi, uint32_t addr, uint16_t port);
213 
215 void rm_wait_peer(struct MetaInfo *mi, int index);
216 
217 #endif // METAINFO_H
int check_substate(struct MetaInfo *mi, int index)
检查某一分片的子分片状态并打印
Definition: metainfo.c:239
struct PieceInfo * pieces
分片信息数组
Definition: metainfo.h:97
int fd
连接套接字
Definition: peer.h:104
void add_peer(struct MetaInfo *mi, struct Peer *p)
增加一个 peer
Definition: metainfo.c:167
uint32_t addr
ip 地址,方便比较的形式
Definition: metainfo.h:73
unsigned char * substate
标记子分片完成情况: SUB_NA - 未下载,SUB_DOWNLOAD - 下载中,SUB_FINISH - 下载完成。 ...
Definition: metainfo.h:57
int listen_fd
侦听套接字
Definition: metainfo.h:100
size_t bitfield_size
bitfield 的字节大小,即 nr_pieces / 8 上取整
Definition: metainfo.h:94
void extract_trackers(struct MetaInfo *mi, const struct BNode *ast)
提取 tracker 列表
Definition: metainfo.c:37
struct Tracker * get_tracker_by_timer(struct MetaInfo *mi, int timerfd)
根据定时器描述符找 tracker
Definition: metainfo.c:277
int nr_wait_peers
已发出 connect 的 peer 数量
Definition: metainfo.h:104
void free_metainfo(struct MetaInfo **pmi)
释放全局信息
Definition: metainfo.c:17
size_t nr_trackers
tracker 数量
Definition: metainfo.h:106
int nr_peers
peers 数组的大小 == 已握手 peer 的数量
Definition: metainfo.h:102
size_t file_size
数据文件大小
Definition: metainfo.h:88
struct WaitPeer * wait_peers
已发出 connect 的 peer 集合
Definition: metainfo.h:105
void del_peer_by_fd(struct MetaInfo *mi, int fd)
根据连接套接字删除 peer
Definition: metainfo.c:179
struct Peer ** peers
已握手 peer 的集合
Definition: metainfo.h:103
uint16_t port
端口号,网络字节序
Definition: metainfo.h:76
char request[128]
请求 url (一般是 /announce, 默认 / )
Definition: metainfo.h:26
int fd
尚未完成连接或握手的套接字
Definition: metainfo.h:71
int find_wait_peer_fd_by_addr(struct MetaInfo *mi, uint32_t addr, uint16_t port)
根据地址找到 peer 的套接字,网络字节序
Definition: metainfo.c:311
int nr_owners
该分片拥有者的数量。
Definition: metainfo.h:54
分片信息
Definition: metainfo.h:51
struct Peer * get_peer_by_addr(struct MetaInfo *mi, uint32_t addr, uint16_t port)
根据网络地址搜索 peer
Definition: metainfo.c:225
int timerfd
发送 KEEP-ALIVE 的定时器
Definition: metainfo.h:101
char method[10]
协议类型 http | udp
Definition: metainfo.h:23
B 编码结点
Definition: bparser.h:39
int timerfd
定时器描述符,用于在 epoll 里处理定时事件。
Definition: metainfo.h:28
int is_downloaded
标记该分片是否已经完成下载:1 - 已下载,0 - 未完成。
Definition: metainfo.h:55
描述一次运行的全局信息
Definition: metainfo.h:86
描述 tracker 的相关信息
Definition: metainfo.h:21
void add_wait_peer(struct MetaInfo *mi, int fd, uint32_t addr, uint16_t port)
添加等待 peer, 网络字节序
Definition: metainfo.c:289
struct Peer * get_peer_by_fd(struct MetaInfo *mi, int fd)
根据连接套接字搜索 peer
Definition: metainfo.c:210
char port[10]
端口(默认 80)
Definition: metainfo.h:25
struct Tracker * trackers
tracker 数组
Definition: metainfo.h:107
struct Tracker * get_tracker_by_fd(struct MetaInfo *mi, int sfd)
根据连接套接字找 tracker
Definition: metainfo.c:261
void extract_pieces(struct MetaInfo *mi, const struct BNode *ast)
提取分片 hash
Definition: metainfo.c:126
unsigned short port
侦听端口
Definition: metainfo.h:99
FILE * file
下载文件
Definition: metainfo.h:89
描述处于等待握手状态的 peer 信息
Definition: metainfo.h:69
描述 peer 信息
Definition: peer.h:102
void rm_wait_peer(struct MetaInfo *mi, int index)
删除等待 peer
Definition: metainfo.c:327
size_t nr_pieces
分片数量,由 file_size 和 piece_size 计算得出,上取整
Definition: metainfo.h:93
uint32_t piece_size
分片大小
Definition: metainfo.h:92
uint32_t addr
ip 的整数形式,用于地址比较,直接来自 sin_addr,故是网络字节序
Definition: peer.h:107
int direction
0: 我方主动连接, 1: 对方主动连接。
Definition: metainfo.h:77
char host[128]
主机名(域名)
Definition: metainfo.h:24
void metainfo_load_file(struct MetaInfo *mi, const struct BNode *ast)
获取文件名,读取文件,分析已经完成的块
Definition: metainfo.c:77
uint32_t sub_size
子分片的大小,使用统一大小的子分片以简化实现
Definition: metainfo.h:95
time_t * subtimer
标记子分片下载等待时间
Definition: metainfo.h:58
size_t sub_count
子分片的数量
Definition: metainfo.h:96
#define HASH_SIZE
SHA1 HASH 的字节数
Definition: metainfo.h:16
int get_wait_peer_index_by_fd(struct MetaInfo *mi, int fd)
根据套接字找到 peer 下标
Definition: metainfo.c:300
int sfd
socket file descriptor, 默认为 -1. 主要用于搜索, 会频繁重置.
Definition: metainfo.h:27