开发Golang BitTorrent客户端时解析tracker返回的peers字段遇阻
解析Tracker返回的Compact格式Peer数据问题
你遇到的核心问题是没处理Tracker默认返回的二进制Compact格式Peer数据,以下是具体的解决思路和实现:
Peer数据的两种格式
BitTorrent Tracker的peers字段支持两种返回格式:- 字典列表格式:每个Peer是包含
ip和port的字典,可读性强但数据体积大; - 二进制Compact格式:默认返回格式,每个Peer用6字节表示——前4字节是大端字节序的IPv4地址,后2字节是大端字节序的端口号。
- 字典列表格式:每个Peer是包含
解析你收到的6字节数据
你看到的};e是二进制数据被文本工具转义后的显示,实际是6字节的原始二进制流。解析逻辑如下:- 拆分6字节为前4字节(IP)和后2字节(端口);
- 将4字节IP转换为十进制点分格式;
- 将2字节端口从大端字节序转换为整数。
Golang实现代码示例
假设你已经把bencoded数据解析为map,peers字段对应[]byte类型,代码如下:import ( "encoding/binary" "fmt" "net" ) func parsePeers(peersData []byte) { // 遍历所有Peer,每6字节一个 for i := 0; i < len(peersData); i += 6 { if i+6 > len(peersData) { break // 处理不完整的Peer数据 } // 解析IPv4地址 ip := net.IPv4(peersData[i], peersData[i+1], peersData[i+2], peersData[i+3]) // 解析端口(大端字节序转uint16) port := binary.BigEndian.Uint16(peersData[i+4 : i+6]) fmt.Printf("找到Peer: %s:%d\n", ip.String(), port) } }额外技巧
如果想让Tracker返回易读的字典格式,可以在请求Tracker时添加compact=0参数(默认compact=1返回二进制格式)。
内容的提问来源于stack exchange,提问作者meberko
相关产品推荐
相关产品推荐

