Go语言开发Torrent应用时Tracker返回Peer端口为0的问题排查
问题分析与解决
首先你的代码存在明显的索引错误:循环中你用peerList[i] = peer赋值,但i是字节数组的偏移量(每次步长6),而peerList的长度是len(bytesPeerList)/6,这会导致数组越界 panic(比如当字节数组长度为12时,i=6时访问peerList[6]会超出数组实际长度)。正确的索引应该是i/6,修正后的循环代码如下:
for i := 0; i < len(bytesPeerList); i += 6 { ip := net.IP{bytesPeerList[i], bytesPeerList[i+1], bytesPeerList[i+2], bytesPeerList[i+3]} port := binary.BigEndian.Uint16([]byte{bytesPeerList[i+4], bytesPeerList[i+5]}) peer := Peer{ ip: ip.String(), port: port, } // 修正索引:用i/6作为peerList的下标 peerList[i/6] = peer }
再看端口0的问题:
- 从你提供的响应字节数组来看,peers字段对应的字节是
[159,148,57,222,0,0],后两个字节确实是0x0000,说明Tracker确实返回了端口0。 - 按照BitTorrent协议,端口0是无效端口,绝对不能用这个端口与Peer通信。
多个种子都出现该情况的可能原因:
- 你使用的Tracker本身存在bug,或者对请求返回了异常数据。
- 检查请求参数是否符合BitTorrent规范:确认是否遗漏了
port(本地监听端口)、uploaded/downloaded/left等必要参数,部分Tracker会因参数不全返回异常的peer数据。 - 更换其他公共Tracker测试(如
udp://tracker.opentrackr.org:1337/announce),对比返回结果验证问题来源。
总结:先修正代码中的索引错误,再排查请求参数或更换Tracker验证,端口0无法用于实际的Peer通信。
内容的提问来源于stack exchange,提问作者nmbarel
相关产品推荐
相关产品推荐

