Бложек теперь на old.mrThe.name. Следите за обновлениями.

В связи с переходом на линукс, встала проблема о использовании торрентов. И не просто использовании, а что бы как и раньше – не думать о рейтинге. Благо, тут всё opensource и всё намного проще чем в случае с uTorrent.

.

В качестве клиента я выбрал Deluge. Он лёгкий, достаточно быстрый и часто обновляется. Написан на питоне и использует libtorrent.

.

Так как патч будет для libtorrent, то он будет работать для всех клиентов, использующих эту либу.
И так, приступим.

.

Скачиваем свежий libtorrent-rasterbar, распаковываем в любую удобную папку.

Теперь, нужно найти в каком файле передаётся информация на трекер. Выполним поиск по содержимому файлов:

find -type f -exec grep -il “downloaded” {} ;

На выходе будет достаточно большой список файлов. Опытным путём, установлено, что нужные файлы:

./src/http_tracker_connection.cpp
./src/udp_tracker_connection.cpp

Их-то и предстоит патчить.

.

Как видно из названия, первый файл – для http соединений, а второй – для udp. Второй случай, конечно, много реже, но его так же не мешает пропатчить.

.

Теперь по порядку:

.

http_tracker_connection.cpp
Находим строку в которой есть “downloaded”. У меня сразу был найдена нужная строка, выглядит примерно так:

snprintf(str, sizeof(str), “&peer_id=%s&port=%d&uploaded=%”PRId64
“&downloaded=%”PRId64″&left=%”PRId64″&corrupt=%”PRId64″&compact=1″
“&numwant=%d&key=%x&no_peer_id=1″
, escape_string((const char*)&tracker_req().pid[0], 20).c_str()
, tracker_req().listen_port
, stats ? tracker_req().uploaded : 0
, stats ? tracker_req().downloaded : 0
, stats ? tracker_req().left : 0
, stats ? tracker_req().corrupt : 0
, tracker_req().num_want
, tracker_req().key);
url += str;

Здесь нас интересуют параметры downloaded и left.
Теперь просто заменим строки

, stats ? tracker_req().downloaded : 0
, stats ? tracker_req().left : 0

на

, 0
, 0

Тут, конечно, можно добавить деление реально скачанного, например, на 5. Что бы уменьшить риск бана, но это уже по вкусу.

.

Далее, udp_tracker_connection.cpp:
Находим строки вида

detail::write_int64(stats ? req.downloaded : 0, out); // downloaded
detail::write_int64(stats ? req.left : 0, out); // left

И по аналогии с http версией заменяем их на

detail::write_int64(0, out); // downloaded
detail::write_int64(0, out); // left

Вот собственно и всё. Осталось скомпилировать и установить libtorrent:

./configure && make && make install

В случае с ubuntu, не забывайте о sudo.

.

Надо сказать, собирается он довольно долго. На моём Athlon X2 2.1 Ghz и 3GB озу это заняло около 15-ти минут.

.

Да, всё описанное действительно для версии 0.15.0. Например в 0.14.9 строки выглядят немного по другому, хотя найти их не составляет труда.

Похожие записи:

24 комментария к “Патчим libtorrent!”

  1. Tiradoir Пишет:

    А как этот патч привязать(присунуть) к Deluge или его вручную прокомпилить и он идет как составляющая к Deluge?
    Просто боюсь то что Deluge свою либу постарее версии юзает и может даунгрейдить эту.

  2. admin Пишет:

    Просто собираешь и устанавливаешь эту либу, deluge её подхватит при запуске. Главное, что бы версия совместимая была.

  3. 1vanu4 Пишет:

    А Deluge должен быть установлен заранее?

    mr.The: не имеет значения. Хотя, у меня был установлен до патча.

  4. ZogG Пишет:

    вот не люблю таких людей, хотите скачать, но не готовы другим помочь. на этом основано п2п коммьюнити

  5. Tiradoir Пишет:

    ZogG Пишет:
    апреля 17, 2010 at 15:38
    Личеров куча, а п2п коммьюнити где то за бугром или даже в другом мире.
    Так что нафиг раздавать и портить себе жесткий диск лишней нагрузкой.

  6. admin Пишет:

    Нет, раздавать надо, но по мере сил. Я уже ответил тебе в твиттере, что у меня асимметричный канал, и поддерживать ратио проблематично. Поэтому раздаю по мере сил 24\7 и не напрягаюсь.

    Как там было.. От каждого по способностям, каждому по потребностям?

  7. Tiradoir Пишет:

    Раздавать не надо.Мое Эго выше обычных людишек и я могу лишь в НГ и еще какие-то дни выделить 50 кб/c на сидерство.

  8. T-Rey Пишет:

    @Tiradoir, чтоб тебе сидеры на всех торрентах больше 10кб\с не выдавали

  9. admin Пишет:

    На правах кэпа: у меня обычно так и есть, ~50 сидеров отдают по 1-10 кб. Норм)

  10. T-Rey Пишет:

    А вот нихера, я имел ввиду общий поток отдач =р

  11. T-Rey Пишет:

    для freebsd интересен /usr/ports/net-p2p/libtorrent/work/libtorrent-0.12.6/src/tracker/tracker_http.cc

  12. #Wolf# Пишет:

    на ./configure застревает =[

    Checking for posix thread support:
    checking for the pthreads library -lpthreads… no
    checking whether pthreads work without any flags… no
    checking whether pthreads work with -Kthread… no
    checking whether pthreads work with -kthread… no
    checking for the pthreads library -llthread… no
    checking whether pthreads work with -lpthread… yes
    checking for joinable pthread attribute… PTHREAD_CREATE_JOINABLE
    checking if more special flags are required for pthreads… no

    Checking for boost libraries:
    checking for boostlib >= 1.36… configure: error: We could not detect the boost libraries (version 1.36 or higher). If you have a staged boost library (still not installed) please specify $BOOST_ROOT in your environment and do not give a PATH to –with-boost option. If you are sure you have boost installed, then check your version number looking in . See http://randspringer.de/boost for more documentation.

    mr.The: всё понятно же, нужно установить boost. А гугл подскажет, как это сделать.

  13. Sergey Пишет:

    В libtorrent-rasterbar-0.14.10 не так совсем.
    Нет left и stats в файле http_tracker_connection.cpp

    Даже похожего ничего нет.

    Не подскажешь, что там менять?

    Спасибо.

  14. Sergey Пишет:

    есть такое:
    }
    entry const* complete = scrape_data->find_key(“complete”);
    entry const* incomplete = scrape_data->find_key(“incomplete”);
    entry const* downloaded = scrape_data->find_key(“downloaded”);
    if (complete == 0 || incomplete == 0 || downloaded == 0
    || complete->type() != entry::int_t
    || incomplete->type() != entry::int_t
    || downloaded->type() != entry::int_t)
    {

  15. Sergey Пишет:

    И такое:
    url += “&downloaded=”;
    url += to_string(tracker_req().downloaded).elems;

    url += “&left=”;
    url += to_string(tracker_req().left).elems;

    mr.The: вот это как раз то, что нужно.
    Заменяешь to_string(tracker_req().downloaded).elems; на “0″
    и to_string(tracker_req().left).elems так же на “0″.

  16. Sergey Пишет:

    Большое спасибо, заменил. Все зависимости удовлетворены, но при компиляции вылезает такая ошибка:

    ../../src/http_tracker_connection.cpp:140: error: expected ‘;’ before ‘url’
    make[3]: *** [http_tracker_connection.lo] Ошибка 1
    make[3]: Leaving directory `/home/serge/libtorrent-rasterbar-0.14.10/build/src’
    make[2]: *** [all-recursive] Ошибка 1
    make[2]: Leaving directory `/home/serge/libtorrent-rasterbar-0.14.10/build’
    dh_auto_build: make -j1 returned exit code 2
    make[1]: *** [override_dh_auto_build-nopy] Ошибка 2

    В этой 140 строке следующее:

    url += “&corrupt=”;

    Может её тоже теперь менять нужно?

  17. Sergey Пишет:

    Я так выставил:

    url += “&downloaded=”;
    url += 0;

    url += “&left=”;
    url += 0;

    Может не правильно?

  18. Sergey Пишет:

    Даже с оригинальным файлом не собирается. Что-то ему в этом файле не нравится:

    ../../src/http_tracker_connection.cpp:143: error: expected ‘;’ before ‘if’
    ../../src/http_tracker_connection.cpp:466: error: expected ‘}’ at end of input
    ../../src/http_tracker_connection.cpp:466: error: expected ‘}’ at end of input
    ../../src/http_tracker_connection.cpp: At global scope:
    ../../src/http_tracker_connection.cpp:466: error: expected ‘}’ at end of input
    make[3]: *** [http_tracker_connection.lo] Ошибка 1

  19. Sergey Пишет:

    Какой-то касяк при сборке. Может потому что сижу на нестабильном Дебиане:-)
    Пропатчил и собрал libtorrent под rtorrent.
    Патчится намного быстрее и проще. Много настроек накруток и всяких обманов. Себе уменьшил до нуля download. Работает. Другие настройки лень было проверять.
    На этом успокоился)

  20. Dmitry Пишет:

    Очень полезно. rTorrent 0.12.6/0.8.6 обрался без проблем. Огромнейшее спасибо за статью, все получилось.

    Огромнейшая просьба к автору статьи, как-то по возможности, статейку написать libtorrent DHT patch. Наподобии той, которая у Вас по Utorrent, включение PEX и DHT в приватных торрентах.

    Спасибо.

  21. vadimka.2009 Пишет:

    Все сделал, как описал автор, собралось все хорошо, но только беда – не работают эти доработки. скачал для теста фильмец с торрента – все осталось по прежнему, трафик весь учелся. что не так?

  22. Veteriuz Пишет:

    сделал как написано, но после перезагрузки скаченное вновь стало учитываться
    быть может я “недоустановил”?
    команда “./configure && make && make install” устанавливает, я правильно понял же? или после нее нужно еще что-то сделать?

    mr.The: должно работать. Возможно, система автоматически скачала обновления, хотя врядли.
    Попробуй удалить либторрент из менеджера пакетов, а потом поставь через make install.

  23. banda Пишет:

    А можно сделать такой патч для rtorrentа?

  24. TWilight_Wolf Пишет:

    Для rtorrent можно аналогичным способом) разница лишь в том, что rtorrent использует другую библиотечку libtorrent не rasterbar, а rakshasa.

Оставить комменатрий: