You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 10:11:21