2011-03-09 27 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); 
}