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
相关产品推荐
相关产品推荐

