Цитата
С возвращением, последний раз вы были здесь: 7.1.2012, 9:11
^ Ничего себе!
Привет, друзья! Меня зовут Ваня Сорокин, я тот самый unxed, который изобрел ретрекеры. Подумал, и, похоже, изобрёл их второй раз.
Идея такая: модифицируем код клиента, чтобы он, вместе с обычным анонсом на трекер, слал ещё один точно такой же анонс в DHT, только вместо инфохэша использовал
ХЭШ(ХЭШ_ИСХОДНОГО_ТОРРЕНТА + ВНЕШНИЙ_IP_КЛИЕНТА)
А в качестве IP указывал провайдерский IP из локального диапазона. Естественно, если провайдерский IP — внешний, это всё делать не нужно.
Понимаете, да? Если внешний айпи у двух клиентов совпадает, то они, вероятно, сидят из одного NAT'а, и смогут через обычную DHT, без всяких retracker.local и патчей узнавать локальные IP друг друга.
Как вам? Как по мне, выглядит красиво. И если DHT позволяет указывать в качестве своего IP что угодно — должно сработать. Но нужна поддержка в клиентах. Я мог бы попробовать в qBittorrent добавить такое, например.
UPD: Смотрю в исходники
libtorrent-rasterbar, файл src/kademlia/dht_storage.cpp
Код
void announce_peer(sha1_hash const& info_hash
, tcp::endpoint const& endp
, string_view name, bool const seed) override
— выходит, в DHT действительно можно сохранить произвольную пару IP:port для некоего хэша. То есть концепция рабочая.
UPD#2: Как определять провайдерский IP из локального диапазона, если клиент за роутером? По UPNP. Если UPNP выключен или не отвечает, использовать локальный адрес устройства.
UPD#3: Возможное решение для самого частого кейса: Windows + uTorrent. Приложение, висит в трее, работает ретрекером на локалхосте, данные хранит/получает из DHT, как описано выше. Также следит, чтобы в hosts retracker.local смотрел на localhost (можно использовать 127.0.0.14 или что-нибудь такое, чтоб не мешать пользовательским HTTP серверам), если нужной записи нет, даёт создать одной кнопкой. И ещё пусть проверяет, что uPNP на роутере работает (если нет, рассказывает, как настроить).