单个 peer 相关操作 API 实现
更多...
#include "peer.h"
#include "util.h"
#include <string.h>
#include <assert.h>
#include <unistd.h>
#include <arpa/inet.h>
static int byte_index_of_ |
( |
unsigned |
off | ) |
|
|
inlinestatic |
static unsigned char get_bit |
( |
unsigned char * |
bytes, |
|
|
unsigned |
bit_offset |
|
) |
| |
|
static |
获取 bit
- 参数
-
bytes | bit field |
bit_offset | bit 偏移 |
- 返回
- bit 值
static unsigned in_byte_mask_of_ |
( |
size_t |
off | ) |
|
|
inlinestatic |
static int in_byte_offset_of_ |
( |
unsigned |
bit_offset | ) |
|
|
inlinestatic |
获取位域的字节内偏移
BitTorrent 的规定与常规思维不同, MSB 是 [0], LSB 是 [7], 所以要用 7 减去与出来的值.
- 参数
-
- 返回
- 字节内偏移
void peer_free |
( |
struct Peer ** |
peer | ) |
|
unsigned char peer_get_bit |
( |
struct Peer * |
peer, |
|
|
unsigned |
bit_offset |
|
) |
| |
获取 peer 的位域
- 参数
-
peer | 要获取的 peer |
bit_offset | 位偏移量 |
获取 BT 报文
len 不应为 0, keep-alive 由上层检查
struct Peer* peer_new |
( |
int |
fd, |
|
|
size_t |
nr_pieces |
|
) |
| |
peer 构造
bitfield 的大小是对 nr_pieces / 8 的上取整.
void peer_send_msg |
( |
struct Peer * |
peer, |
|
|
struct PeerMsg * |
msg |
|
) |
| |
向 peer 发送 BT 消息
提前构造好 msg 并将其发送给指定的 peer, 以 msg 的 len 成员为准发送缓冲区,调用者保证其正确性。
- 参数
-
void peer_set_bit |
( |
struct Peer * |
peer, |
|
|
unsigned |
bit_offset |
|
) |
| |
设置 peer 的位域
- 参数
-
peer | 要设置的 peer |
bit_offset | 位偏移量 |
void print_bit |
( |
unsigned char * |
bytes, |
|
|
size_t |
bit_len |
|
) |
| |
向标准输出打印 bitfield
- 参数
-
bytes | bitfield 缓冲区 |
bit_len | bit 数, 一般对应分片数量 |
static void print_bit_in_byte |
( |
unsigned char |
byte, |
|
|
size_t |
bit_len |
|
) |
| |
|
static |
打印一个字节的 bit
- 参数
-
byte | bit field |
bit_len | 限长(小于 8) |
static void set_bit |
( |
unsigned char * |
bytes, |
|
|
unsigned |
bit_offset |
|
) |
| |
|
static |
设置 bit
- 参数
-
bytes | bit field |
bit_offset | bit 偏移 |
初始值:=
{
"CHOKE",
"UNCHOKE",
"INTERESTED",
"NOT_INTERESTED",
"HAVE",
"BITFIELD",
"REQUEST",
"PIECE",
"CANCEL",
}
对应 BT 报文类型的字符串