2011-03-09 71 views
2

我想解析通过UDP发送给BitTorrent服务器的宣告请求的响应。我找回数据,但我不认为我正确处理同行的IP地址和端口,因为我无法建立与其中的任何一个连接:正确解析Java中的BitTorrent UDP宣告响应

 Map<String, String> info = new Hashtable<String, String>(); 
     if (goodResponse) { 
     try { 
      int resAction = Utils.toInt(Utils.subArray(responseData, 0, 4)); 
      int resTrans = Utils.toInt(Utils.subArray(responseData, 4, 4)); 
      int interval = Utils.toInt(Utils.subArray(responseData, 8, 4)); 
      int leechers = Utils.toInt(Utils.subArray(responseData, 12, 4)); 
      int seeders = Utils.toInt(Utils.subArray(responseData, 16, 4)); 

      if (resAction != ERROR && resTrans == transactionID && resAction == ANNOUNCE) { 

       info.put("udp", "tracker"); 
       info.put("seeders", String.valueOf(seeders)); 
       info.put("leechers", String.valueOf(leechers)); 
       info.put("interval", String.valueOf(interval)); 
       try { 
        for (int peer = 0; peer < leechers + seeders; peer++) { 
         InetAddress ip = Inet4Address.getByAddress(Utils.subArray(responseData, (20 + (6 * peer)), 4)); 
         int port = (int)Utils.toChar(Utils.subArray(responseData, (24 + (6 * peer)), 2)); 

         if (port != 0) { 
          info.put(ip.getHostAddress(), String.valueOf(port)); 
         } 
        } 
       } catch (ArrayIndexOutOfBoundsException e) { 
        Log.w(TAG, "Too many peers returned, some were dropped"); 
       } 
      } else if (resAction == ERROR) { 
       error(responseData); 
       info = null; 
      } else { 
       torrent.setErrorMessage("Unable to announce, invalid request"); 
       Log.i(TAG, "ANNOUNCE-E: A:" + resAction + " T: " + resTrans + " (" + transactionID + ") I: " + interval + " P: " + seeders + "/" + leechers); 
       info = null; 
      } 
     } catch (Exception e) { 
      torrent.setErrorMessage("Unable to announce with tracker " + host); 
      Log.e(TAG, "ANNOUCE-EX: " + e.getClass().getSimpleName() + " - " + e.getMessage()); 
      info = null; 
     } 
    } 

下面是辅助功能:

public static int toInt(final byte[] input) { 
    return ByteBuffer.wrap(input).getInt(); 
} 

public static char toChar(final byte[] input) { 
    return ByteBuffer.wrap(input).getChar(); 
} 

public static long toLong(byte[] input) { 
    return ByteBuffer.wrap(input).getLong(); 
} 

public static short toShort(byte[] input) { 
    return ByteBuffer.wrap(input).getShort(); 
} 

这个代码不吐主机像79.31.92.101:49378和79.168.1.215:65535,所以看起来正确,但没有将允许连接。我是否解析了对等数据?

的文档状态:

 Response: 
     0   32-bit integer action   1 // announce 
     4   32-bit integer transactionID 
     8   32-bit integer interval 
     12   32-bit integer leechers 
     16   32-bit integer seeders 
     20 + 6 * n 32-bit integer IP address 
     24 + 6 * n 16-bit integer TCP port (unsigned int) 
     20 + 6 * N 

文件链接: http://xbtt.sourceforge.net/udp_tracker_protocol.html

http://www.rasterbar.com/products/libtorrent/udp_tracker_protocol.html

+0

请分享代码发送UDP请求到服务器,以及如何处理它。 – 2011-10-13 13:55:44

回答

1

甜,一些调整,我想通了。端口部分是正确的,IP地址是关闭的。使用此行代替InetAddress行;

String ip = Utils.intToIp(Utils.toInt(Utils.subArray(responseData, (20 + (6 * peer)), 4))); 

intToIP是:

public static String intToIp(int i) { 
    return ((i >> 24) & 0xFF) + "." + ((i >> 16) & 0xFF) + "." + ((i >> 8) & 0xFF) + "." + (i & 0xFF); 
}