我正在尝试在Bittorrent主线中实现DHT节点。到目前为止,我已经与引导节点进行了进出连接,根据一些编码示例,该查询似乎还不错,但是我返回的结果的一部分都被打乱了(包含实际数据的部分):

d2:ip6:µ§ û©Å1:rd2:id20:ëÿ6isQÿJì)ͺ«òûãF|Âge1:t2:aa1:y1:re


到目前为止,这是我的代码:

private static String serverName = "router.utorrent.com";
private static int port = 6881;
private static String packet = "d1:ad2:id20:abcdefghij0123456789e1:q4:ping1:t2:aa1:y1:qe";
public static void main(String[] args)  {

    int port = Main.port;
    InetAddress address = InetAddress.getByName(Main.serverName);
    DatagramSocket socket = new DatagramSocket();

    byte[] buf = Main.packet.getBytes();
    DatagramPacket packet = new DatagramPacket(buf, buf.length, address, port);
    socket.send(packet);
    byte[] recBuf = new byte[2048];
    DatagramPacket recPacket = new DatagramPacket(recBuf, recBuf.length);

    socket.receive(recPacket);

    System.out.println(new String(extract(recPacket)));
}

  private static byte[] extract(DatagramPacket packet) {
        byte[] data = packet.getData();
        int offset = packet.getOffset();
        int length = packet.getLength();

        byte[] copy = new byte[length];
        System.arraycopy(data, offset, copy, 0, copy.length);

        return copy;
      }


我不确定我是否遇到图表集问题,或者在某些地方找不到指定的编码。

最佳答案

您的回答对我来说似乎是正确的。听起来您希望DHT协议仅使用ascii字符,但事实并非如此。 160位节点ID以20个字节的形式传输,IP和端口以6个字节的形式传输。

参见protocol specification

10-08 19:32