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

DHT服务器find_node请求无响应问题求助

DHT服务器开发问题求助:发送find_node请求无响应

我正在开发一个DHT服务器,最近碰到个头疼的问题:向Bootstrap节点发送find_node请求后,成功收到了包含16个节点信息的416字节compact节点数据;但把这些数据做bdecode解码、存储好IP地址和端口后,向这些节点发送find_node请求却完全收不到任何响应。已经卡了好几天,试了各种办法都没找到问题根源,真心希望能得到技术帮助。

接收数据包并添加节点的代码

public void run() {
    try {
        while (true) {
            byte[] buffer_rcv = new byte[1024];
            DatagramPacket recvPacket = new DatagramPacket(buffer_rcv, buffer_rcv.length);
            socket.receive(recvPacket);
            System.out.println("get!!!");
            new Thread(new Runnable() {
                @Override
                public void run() {
                    // TODO Auto-generated method stub
                    try {
                        LinkedList<Node> nodes = BDecode.bdecode_find_node(recvPacket);
                        for (Node n : nodes) {
                            table.add_node(n);
                        }
                        System.out.println("table size" + table.get_all_nodes().size());
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }).start();
            System.out.println("waiting new packet!!!!!!!");
        }
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

使用jbittorrent api进行bdecode解码的代码

public static LinkedList<Node> bdecode_find_node(DatagramPacket recvPacket) throws IOException {
    byte[]nodes_compact_info = (byte[]) ((Map) new BDecoder().decodeByteArray(recvPacket.getData()).get("r")).get("nodes");
    byte[]node_info = new byte[26];
    byte[]node_id = new byte[20];
    byte[]ip_byte = new byte[4];
    byte[]port_byte = new byte[2];
    int port;
    LinkedList<Node> nodes = new LinkedList<>();
    //System.out.println("nodes_compact_info.length"+nodes_compact_info.length);
    for (int i = 0;i<nodes_compact_info.length/26;i++) {
        //416 = 16 * 26byte_per_node
        //0-19 id 20 21 22 23 ip 24 25 port
        node_info = Utils.subArray(nodes_compact_info, i*26, 26);
        node_id=Utils.subArray(node_info, 0, 20);
        ip_byte = Utils.subArray(node_info, 20, 4);
        String ip = "";
        for (int j = 0;j<ip_byte.length;j++) {
            ip+=Utils.byteToUnsignedInt(node_info[j]);
            ip+=".";
        }
        ip = ip.substring(0, ip.length()-1);
        //System.out.println(ip);
        port_byte = Utils.subArray(node_info, 24, 2);
        port = Utils.byteArrayToInt(port_byte);
        nodes.add(new Node(node_id, ip, port, new Date()));
    }
    return nodes;
}

向节点发送find_node请求的代码

public void get_neighbor() {
    ArrayList<Node> nodes = table.get_all_nodes();
    System.out.println("*********get_neighbor!!!");
    for (Node n : nodes) {
        try {
            byte[] find_node_query = BEncode.find_node(this.id, this.id);
            DatagramPacket sendPacket = new DatagramPacket(find_node_query, find_node_query.length, InetAddress.getByName(n.getIp()), n.getPort());
            for (int i = 0;i<5;i++) socket.send(sendPacket);
            System.out.println("packet send to " + n.getIp() + ":" + n.getPort());
        } catch (UnknownHostException e1) {
            // TODO Auto-generated catch block
            System.out.println("UnknownHostException" + n.getIp());
        } catch (IOException e) {
            // TODO Auto-generated catch block
            System.out.println("cant send packet");
        }
    }
}

相关资源说明

  • Bootstrap返回并解码后的节点compact信息截图
  • 网络抓包截图
  • 向Bootstrap发送find_node请求的抓包截图
  • Bootstrap的响应抓包截图
  • 向节点发送UDP数据包的抓包截图
  • 完整.pcap抓包文件

内容的提问来源于stack exchange,提问作者ahcha.Z

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:50:48