Правильный анализ ответа BitTorrent UDP объявляет в Java - PullRequest
3 голосов
/ 09 марта 2011

Я пытаюсь проанализировать ответ на запрос Announce, отправляемый на сервер BitTorrent через UDP.Я получаю данные обратно, но не думаю, что правильно обрабатываю IP-адреса и порты одноранговых узлов, поскольку не могу установить соединение ни с одним из них:

        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;
        }
    }

Вот помощникfunctions:

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

1 Ответ

1 голос
/ 09 марта 2011

Сладкий, немного подправил, и я понял это.Часть порта была права, 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);
}
...