«Почему Торрент не подключается к пирам, сидам — ничего не загружается!». Пару рекомендаций тем, у кого подобная проблема
Вопрос от пользователя
Здравствуйте.
Давно натыкаюсь на ваш блог, и решила уже много проблем (спасибо большое).
Вот, первый раз не могу сама разобраться: пытаюсь загружать какие-нибудь файлы к себе на ПК, но Торрент не подключается к пирам вообще! Происходит такое со всеми загрузками с разных трекеров.
Думаю, что виновато обновление Windows 10 — до него всё работало (а может просто совпало, не знаю).
Заранее спасибо, Анастасия.
Да, эта проблема «избитая», и встречается достаточно часто. Для начала банальные советы: перезагрузите ПК, проверьте свою скорость интернета и переустановите uTorrent (скачав программу с официального сайта!).
После, можно переходить к более конкретным действиям. 👌
👉 Кстати!
Если у вас несколько иная проблема, скажем, скорость загрузки торрентов доходит до 5 Мб/с, а затем падает до 0-100 Кб/с, рекомендую ознакомиться сначала с этим —>
Что можно посоветовать, если uTorrent «не видит» пиры
👉 ШАГ 1: азы
И так, сначала кратко, о чем мы «говорим»:
- Пиры (Peer) — любые участники сети, раздающие файлы (к ним относятся и сиды, и личи) ;
- Сиды (Seed) — участники сети, у которых есть полная версия загружаемого вами файла;
- Личи — участники сети, у которых файл не загружен до конца (но свою уже загруженную частичку — они могут раздавать подобно сидам) .
Узнать эту информацию можно в окне uTorrent — выбрав нужный торрент и открыв вкладку «Пиры» (для каждого загружаемого торрента — количество пиров будет разным!) .
Пиры — скрин из uTorrent
Когда есть какая-то проблема с «загрузкой» — обычно, вкладка «Пиры» будет пуста (либо там будут приведено несколько пиров с «нулевой» скоростью загрузки от них) .
👉 ШАГ 2
Во многих случаях причиной проблем с загрузкой могут стать антивирусы и брандмауэры. Поэтому, на время диагностики я порекомендую их выключить (обычно, для этого достаточно 1-2 клика мышки по иконке антивируса в трее, рядом с часами. См. пример ниже с Avast) . 👇
Отключение антивируса Avast на 1 час
Также не забудьте о встроенном в Windows брандмауэре. Чтобы отключить его:
- нажмите сочетание Win+R;
- в появившемся окне «Выполнить» — используйте команду firewall.cpl;
- после, передвиньте ползунки в режим «Откл.» и сохраните настройки.
Отключить брандмауэр Windows
Далее перезапустите uTorrent и проверьте скорость загрузки.
👉 ШАГ 3
Обратите внимание на статистику пиров на сайте вашего торрент-трекера. Обычно, она всегда отображается рядом с кнопкой «Загрузить». Чем больше пиров раздает файл — тем, как правило, выше скорость загрузки!
В любом случае, чтобы делать какие-то мало-мальские выводы о «невидимости» пиров — в uTorrent нужно добавить 2-3 торрента с не менее 20+ пирами.
Примечание : некоторые не популярные торрент-трекеры обманывают с количеством пиров (заведомо увеличивают их).
Кроме этого, также советую посмотреть рекомендуемые версии программ для работы с конкретным трекером (обычно в разделе FAQ) . Как правило большинство из них совместимо и работает с последней версией uTorrent от разработчика (однако, есть исключения!).
Рекомендуемые к использованию версии uTorrent — FAQ трекера
👉 ШАГ 4
Теперь о некоторых настройках uTorrent, которые могут быть причиной проблем с загрузкой.
И так, для начала в разделе «Общие» проверьте, чтобы стояло две галочки:
- «Автопроверка ассоциаций»;
- «Запретить спящий режим во время загрузки».
Далее во вкладке «BitTorrent» включите принудительное шифрование протокола, а в «Дополнительно» — отключите IP-фильтрацию (параметр «ipfilter.enable») .
См. скриншот ниже, у вас в настройках uTorrent должно выглядеть примерно также. 👇
Шифрование протокола, IP-фильтр (uTorrent)
После, удостоверьтесь также что во вкладке «Скорость» не стоит жесткое ограничение пиров и скорости загрузки торрента. См. пример ниже. 👇
Ну и последнее: во вкладке «Очередность» проверьте максимальное число одновременных загрузок — возможно, что до вашего торрента ранее просто не доходила очередь. 👀
Макс. одновременных загрузок — uTorrent
👉 ШАГ 5
Если вы ранее подключались к VPN — отключите все подобные сервисы, перезагрузите ПК и снова попробуйте что-нибудь загрузить.
Примечание : в Windows 10 чтобы посмотреть VPN-подключения — нажмите Win+i и перейдите во вкладку «Сеть и Интернет / VPN».
Параметры Windows 10 — сеть и интернет
Если ваше подключение к сети интернет осуществляется через Wi-Fi роутер — проверьте его настройки. В некоторых моделях роутеров в настройках «пропускного режима» для каждого из устройств устанавливается разрешение на доступ к интернету и лимит скорости. См. пример ниже. 👇
Ограничение доступа к интернет, скорости загрузки — роутер Tenda
Как одна из рекомендаций : если работаете через Wi-Fi подключение — попробуйте подключить кабель от Интернет-провайдера напрямую к ПК/ноутбуку (либо, от LAN-порта роутера) .
LAN-кабель от Wi-Fi роутера
👉 ШАГ 6
Если всё вышеперечисленное не помогло — могу посоветовать попробовать альтернативный клиент, например, MediaGet или qBittorrent. Эти программы не только могут полностью заменить классический uTorrent — но и серьезно расширить его функционал.
Как вам, например, автоматически поиск торрентов, не выходя из окна программы?! См. пример ниже. 👇
qBittorrent — хорошая альтернатива uTorrent
Как вариант, если проблема с uTorrent началась относительно недавно, — проверьте точки восстановления Windows (если эта опция включена — ОС делает их автоматически перед каждым обновлением системы или установкой каких-то программ) .
Это может быть весьма полезно, если вы заметили, что проблема с uTorrent началась сразу после какого-то действия (например, обновления драйвера).
О том, как проверить есть ли эти точки восстановления, и как к ним откатить систему — см. мою прошлую заметку, ссылка ниже.
Почему Торрент не подключается к пирам и не качает
Почему Торрент клиент не может найти пиров и выполнить закачку файла, в чем причины этой проблемы и как ее можно решить.
Возможно вам знакома такая ситуация, когда вы захотели скачать любимую игру или интересный фильм через торрент, но, когда вы добавляете в закачки файл, загрузки не происходит. И в этот момент не известно, почему торрент не подключается к пирам и не качает. В этой статье мы обязательно решим этот вопрос.
Причины по которым Торрент не подключается к пирам
Если до этого случая вы скачивали файлы и проблем с подключением к пирам не возникало, то причины могут быть следующие:
- Неполадки на сервере. Проблемы с Интернетом у провайдера. В этом случае ваша система, оборудование и сам клиент ни в чем не виноваты. Причина кроется в неполадках на стороне сервера или провайдера. Возможно, что после исправления проблем вы сможете успешно скачать нужный файл. Вы можете также обратиться на горячую линию провайдера и уточнить причину отсутствия интернета и за какой срок устранят неполадки.
- Нет доступных пиров, сидов. Этот случай бывает часто. Причина проста – возможно файл не популярен и не имеет необходимых доступных частиц для отдачи.
- Настройки торрент-клиента некорректны. Давайте рассмотрим, как правильно настроить клиент для нормальной работы.
Настроим торрент-клиент для стабильной работы
Чтобы открыть настройки, выберите вверху программы вкладку «Настройки», и кликните на пункте «Настройки программы». Нужно пройти процедуру настройки для устранения проблемы, когда Торрент может не подключиться к пирам и не скачивать необходимые файлы.
Теперь в общих должны стоять галочки на пунктах «Запускать свернуто» и «Автопроверка ассоциаций». А также в самом низу «Запретить спящий режим во время загрузки», остальные пункты без галочек.
- В пункте о языках интерфейса установите русский, если по каким-то причинам у вас английский интерфейс в разделе «Language».
- Пункт «Запускать клиент с ОС», здесь вы можете установить настройки по своему усмотрению, если у вас хороший интернет и мощная система, компьютеру не будет в нагрузку запущенный клиент.
- «Устанавливать обновления автоматически» здесь лучше убрать галочку с пункта «Обновляться до бета-версии», ведь они как правило работают не стабильно.
- «Ассоциировать» – этот пункт будет определять торрент файлы и при необходимости запускать. Лучше оставить его включенным.
Что делать, если нет в сети Торрента необходимых пиров?
Пиры (peer) – это компьютер, который скачал файл через торрент-клиент и готов отдать его следующему пользователю по такому-же определенному протоколу. Если вы удалите из списков загрузки торрент-клиента скаченный файл, то программа не сможет больше делиться его частями с другими пользователями в пиринговой сети.
Для лучшего понимания, нужно кратко описать процесс скачивания при помощи пиринговых сетей файлов. В таких сетях, по большому счету, нет серверов, откуда вы качаете файл. И клиентом, и сервером здесь выступают компьютеры пользователей. После того, как определенный пакет от целого файла ваш компьютер скачал на ваш жесткий диск, он оповещает другие компьютеры в сети, что готов им поделиться, которые также в этот момент скачивают этот же файл.
Таким образом, если файл не качается, и программа сообщает, что нет доступных пиров, значит этот файл в ближайшее время вы скачать не сможете, попробуйте найти и поставить другой файл. Подробная инструкция на http://sdelaicomp.ru/wi-fi/podklyuchenie-k-piram-torrent-ne-kachaet-chto-delat.html.
Решаем проблему, когда торрент не подключается к пирам
Ваш провайдер может быть причиной того, что вы не можете скачать торрент. Некоторые подобные компании ограничивают Peer to Peer-трафик, а в некоторых случаях и вовсе выключают возможность его применения. Есть возможность обойти такую хитрость со стороны провайдера. На скрине можно увидеть, как это сделать.
Выключение в настройках IP-фильтра даст возможность подключить больше пиров. Эта опция даст возможность брать частицы торрент-файлов у других сетей и даже у зарубежных узлов. Это даст возможность максимально быстро получить желаемый файл.
Перезапуск клиента может помочь в некоторых случая, когда необходимо перезайти в сеть и подключиться заново. Сделайте это в программе – нажмите «Файл», далее «Выход». После чего стандартным двойным нажатием на иконку запустите приложение.
Блокировать скачивание файлов может брандмауэр Windows. Откройте его, перейдите в настройки и в пункте «Разрешить доступ» укажите вашу программу uTorrent. Проделайте все вышеописанные действия и проблема с подключениями к пирам в Торренте будет исчерпана.
Жесткий диск WD Blue WD10EZEX
SSD Crucial BX500 CT120BX500SSD1
Жесткий диск Transcend StoreJet 25M3 1 TB
Как найти сидов для торрента
Иногда скорость закачки через bittorrent-сети бывает не самой высокой даже при наличии широкого канала в Интернет. А при использовании magnet-ссылок файл может быть вообще не найден.
Проблема зачастую кроется в отсутствии сидеров или их малом количестве. Ситуация вполне типичная — многие раздачи 3-4 летней давности заброшены, так как потеряли актуальность. Исключение составляют только очень популярные вещи. Для решения этой проблемы можно попробовать самостоятельно добавить к раздаче (т. е. к закачке) в торрент-клиенте дополнительные трекеры в надежде на то, что хоть на них-то найдутся желанные сидеры.
Ниже представлен список популярных торрент-трекеров. Вставлять в свойства торрент файла.
Возвращаемся на раздачу или как сделать невозможное
Время на прочтение
14 мин
Количество просмотров 70K
Предыстория
Не так давно, а именно 5 июня хабрачеловек по имени alan008 задал вопрос. Чтобы не заставлять ходить за подробностями, приведу его здесь:
Нужна помощь!
За несколько лет с разных трекеров (преимущественно c rutracker’а) разными клиентами (преимущественно uTorrent’ом) скачано много гигабайт разного полезного контента. Скачанные файлы впоследствии вручную перемещались с одного диска на другой, uTorrent их соответственно не видит. Многие .torrent файлы устарели сами по себе (например, велась раздача сериала путем добавления новых серий заменой .torrent файла).
Теперь сам вопрос: есть ли способ автоматически (не вручную) установить соответствие между имеющимися на компьютере .torrent файлами и содержимым, раскиданным по разным логическим дискам компьютера? Цель: удалить лишние (неактуальные) .torrent файлы, а для актуальных — поставить всё на раздачу. У кого какие идеи?
![]()
При необходимости (если это требуется) можно снова поместить все файлы данных в один каталог на одном логическом диске.
В обсуждениях сошлись на том, что если это и можно сделать, то только ручками. Мне же этот вопрос показался интересным, и после возвращения из отпуска я нашел время, чтобы в нем разобраться.
Потратив в общей сложности неделю на разбор формата .torrent-файла, поиск нормально работающей библиотеки для его парсинга, я приступил к написанию программы, которая позволит решить проблему затронутую в упомянутом вопросе.
Прежде чем начать, стоит отметить несколько моментов:
- Получилось много, но не все.
- По формату файла .torrent будут даны лишь необходимые пояснения.
- Людей, чувствительных к временами некачественному коду, прошу меня заранее простить — я знаю, что многое можно было написать лучше, оптимальнее и безглючнее.
Для тех, кому интересно, что из этого получилось, технические подробности и подводные камни — прошу под кат.
В данном случае имеется отличный способ решения — перекачать заново. Но мы же не ищем легких путей, да и предлагался такой вариант! Итак, будем решать задачу по сложному — не скачивать.
Приступая к написанию любой программы, необходимо сначала продумать хотябы базовый алгоритм ее работы. В нашем случае алгоритм, по сути, состоит из двух шагов:
- Найти и прочитать все .torrent-файлы;
- Найти в куче файлов тот, который соответствует описанному в .torrent, и переместить его в папку, соответствующую пути в .torrent.
Для реализации своей идеи, я использовал C#, однако для этого подойдет любой язык, на котором есть библиотеки для чтения файлов в формате bencode и реализована возможность считать SHA-1 хеш.
Ну что же, приступим к решению поставленной задачи.
Ищем торренты и читаем их
После того, как я разобрался с устройством .torrent-файлов, передо мной встал вопрос парсинга всего этого чуда. Прошерстив интернет по данному вопросу, я обнаружил несколько .NET-библиотек под это дело. Выбор свой я остановил на, более-менее понятной и работающей из коробки библиотеке BencodeLibrary, однако впоследствии пришлось ее немного дополнить под свои нужды, но об этом позже.
Начнем с самого простого момента — чтения .torrent.
Строение .torrent-файла довольно простое — он представляет из себя словарь в формате bencode. В данном словаре нас интересует только пара с ключом info — блок описания файлов. Этот тоже является словарем и содержит в себе информацию об имени файлов, их размере. Кроме того, как многим известно, торрент хеширует файлы не целиком, а по кускам определенной длины, которая зависит от размера этих файлов. Информация о размере этого куска также содержится в словаре info.
Для хранения информации из прочитанного файла будем использовать такой класс Torrent
:
class Torrent
public class Torrent
{
public Torrent(string name, List<LostFile> files, int pieceLength, char[] hash, string fileName)
{
Name = name;
Files = files;
PieceLength = pieceLength;
Hash = hash;
FileName= fileName;
}
public string Name;
public int PieceLength;
public char[] Hash;
public List<LostFile> Files;
public string FileName;
...
}
Здесь поля хранят следующую информацию:
* Name
— имя торрента (вообще говоря — имя папки или имя файла)
* Files
— список файлов, которые нам надо будет в дальнейшем искать
* PieceLength
— размер тех самых кусочков, хеш которых нам предстоит считать
* Hash
— хеш строка всех файлов
* FileName
— имя .torrent-файла на диске
Теперь стоит заострить внимание на строке хеша. Она составляется очень просто. Все файлы склеиваются в один (виртуально конечно) друг за другом, образуя при этом один БОЛЬШОООООООЙ воображаемый файл. В этом воображаемом файле берем кусок длины PieceLength
, считаем SHA1 хеш, кладем хеш в строку, берем следующий кусок, считаем хеш, дописываем к концу строки с хешем предыдущего куска. Т. е. это обычная конкатенация хешей всех кусков.
Как мог заметить внимательный читатель, файл внутри класса — это не просто файл, а особый тип данных, в котором файл описывается некой конструкцией типа LostFile
. Вот она:
class LostFile
public class LostFile
{
public LostFile(string name, long length, long beginFrom)
{
Name = name;
Length = length;
BeginFrom = beginFrom;
}
public string Name;
public long Length;
public long BeginFrom;
. . .
}
Здесь все просто: имя файла и его размер. Кроме того этот класс содержит еще одно поле — BeginFrom
. Оно описывает начало этого файла в том БОЛЛЬШОООООМ воображаемом файле. Он нужен, чтобы взять правильную часть файла для подсчета хеша — ведь длина файла очень редко кратна длине куска.
Подготовив структуры для хранения необходимой информации, можно приступать к их заполнению.
С помощью найденной на просторах интернета библиотеки BencodeLibrary мы читаем наш .torrent-файл и выкорчевываем из него блок info:
List<LostFile> files = new List<LostFile>(); // список файлов, понадобится позднее
BDict torrent = (BDict)BencodingUtils.DecodeFile(filename, Encoding.UTF8);
BDict fileInfo = (BDict)torrent["info"];
Далее из этого блока необходимо забрать данные об имени торрента, размере куска.
string name = ((BString)fileInfo["name"]).Value;
int pieceLength = (int)((BInt)fileInfo["piece length"]).Value;
С чтением хеша возникла проблема, решение которой мне не очень нравится, но оно работает. Дело в том, что по спецификации все строки в .torrent-файле должны быть в UFT8. Если читать хеш, который по спецификации записан в формате bencode-строки, как UTF8-строку, то возникнет проблема сравнения — хеши одинаковых кусков не совпадут. Читая же торрент в предлагаемой кодировке codepage-437, мы получим проблемы с русскими буквами в путях. Выход из такой ситуации, которая меня тормознула на два дня, я нашел не лучший, но работающий — читать два раза в разных кодировках.
torrent = (BDict)BencodingUtils.DecodeFile(filename, Encoding.GetEncoding(437));
char[] pieces = ((BString)((BDict)torrent["info"])["pieces"]).Value.ToCharArray();
В этом месте мы передаем в метод `BencodingUtils.DecodeFile` вторым параметром информацию о кодировке. Это как раз тот момент, когда пришлось добавлять один метод в библиотеку — изначально codepage-437 была вшита в код.
Мы добрались до самого интересного момента в этой части — чтение информации о файлах. Торрент файлы бывают двух типов. Эти типы различаются тем, сколько файлов в них описано. При описании только одного файла в .torrent пишется его имя и размер.
Сначала разберем .torrent с описанием одного файла.
long Length = ((BInt)fileInfo["length"]).Value;
files.Add(new LostFile(name, Length, 0)); // files - список файлов
Тут все просто — имя торрента совпадает с именем файла. В случае, когда файлов в раздаче много, то в поле name пишется имя папки, в которую их надо положить (на самом деле может быть что угодно, но почему-то все пишут имя папки в которой эти файлы лежали при создании). Кроме того появляется список files в котором содержится информация о каждом файле: путь к нему и размер. Если размер — просто целое число, то путь к файлу представляет собой список из строк (имен директорий), пройдя по которым мы увидим этот файл.
Такое лучше пояснять на примере. Для файлов level_1level_2_1file_1.txt
и level_1level_2_2file_2.txt
, если мы захотим их раздавать, поле name будет содержать имя папки верхнего уровня ("level_1"
), а список path для одного из файлов будет следующего вида: {"level_2_1", "file_1.txt"}
и {"level_2_2", "file_2.txt"}
для другого.
Нам для .torrent с несколькими файлами надо путь до каждого файла собрать в одну строку. Кроме того, надо хранить начало каждого файла в том БОЛЬШООООМ (не забыли, правда же?!):
BList filesData = (BList)fileInfo["files"];
long begin = 0;
foreach (BDict file in filesData)
{
BList filePaths = (BList)file["path"];
long length = ((BInt)file["length"]).Value;
string fullPath = name;
foreach (BString partOfPath in filePaths)
{
fullPath += @"" + partOfPath.Value;
}
files.Add(new LostFile(fullPath, length, begin)); // files - список файлов
begin += length;
}
Очень важно отметить, что порядок следования файлов в БОЛЬШОООООМ файле может быть любым, не обязательно по алфавиту или по размеру. Но порядок файлов в списке files будет точно таким же. Это ключевой момент для понимания принципа хеширования. Для примера, в ситуации, изображенной на первом рисунке, список файлов будет следующим: {"file_3","file_1", ..., "file_2"}
. Таким образом, считая хеш одного файла, мы знаем какой файл надо будет брать следующим.
Когда мы все это дело прочитали и посчитали — давайте создадим и вернем экземпляр Torrent
:
new Torrent(name, files, pieceLength, pieces, filename);
Собирая теперь все чтение и разбор .torrent-файла воедино, получаем:
ReadTorrent
static Torrent ReadTorrent(string filename)
{
List<LostFile> files = new List<LostFile>();
BDict torrent = (BDict)BencodingUtils.DecodeFile(filename);
BDict fileInfo = (BDict)torrent["info"];
string name = ((BString)fileInfo["name"]).Value;
int pieceLength = (int)((BInt)fileInfo["piece length"]).Value;
torrent = (BDict)BencodingUtils.DecodeFile(filename, Encoding.GetEncoding(437));
char[] pieces = ((BString)((BDict)torrent["info"])["pieces"]).Value.ToCharArray();
if (fileInfo.ContainsKey("files")) // Multifile torrent
{
BList filesData = (BList)fileInfo["files"];
long begin = 0;
foreach (BDict file in filesData)
{
BList filePaths = (BList)file["path"];
long length = ((BInt)file["length"]).Value;
string fullPath = name;
foreach (BString partOfPath in filePaths)
{
fullPath += @"" + partOfPath.Value;
}
files.Add(new LostFile(fullPath, length, begin));
begin += length;
}
}
else // Singlefile torrent
{
long Length = ((BInt)fileInfo["length"]).Value;
files.Add(new LostFile(name, Length, 1));
}
return new Torrent(name, files, pieceLength, pieces, filename);
}
Теперь, когда у нас есть все необходимые данные, мы готовы к самому интересному — поиску наших файлов.
Ищем файлы
Мы вплотную подошли к реализации второго шага нашего алгоритма. Для этого будем использовать метод FindFiles
такого вида:
void FindFiles(Torrent torrent, List<FileInfo> files, string destinationPath) {}
Здесь files
— список файлов, среди которых мы будем искать, destinationPath
— путь до папки назначения, в которую будут помещаться найденные файлы.
Для каждого файла в .torrent мы будем перебирать все файлы из кучи и их сверять. Так как проверка хеша довольно затратна, то надо сначала отсеять явно левые файлы. Ну посудите сами: если я качал дискографию в .mp3 и переместил ее, то явно не менял расширения файлов. Имя мог поменять, а вот расширение вряд ли.
FileInfo fileOnDisk = files[j];
if (fileOnDisk.Extension != Path.GetExtension(fileInTorrent.Name))
continue;
Также стоит проверять длину файла, но это уже сомнительно и иногда может давать ложные срабатывания. Только после того, как мы отсеяли по расширению явно левые файлы, можно приступать к проверке хеша.
if (!torrent.CheckHash(i, fileOnDisk))
continue;
После того как проверка завершена, и мы удостоверились в соответствии файла искомому — перемещаем его в папку назначения с правильным путем. Перед перемещением будем естественно проверять наличие директории, а также проверим есть ли уже такой файл или нет. copyFile
— переменная передаваемая с формы пользователем, ее назначение, я думаю, понятно всем.
FileInfo fileToMove = new FileInfo(destinationPath + @"" + fileInTorrent.Name);
if (!Directory.Exists(fileToMove.DirectoryName))
Directory.CreateDirectory(fileToMove.DirectoryName);
if (!fileToMove.Exists)
{
// Перемещаем-копируем файл
if (copyFile)
File.Copy(fileOnDisk.FullName, fileToMove.FullName);
else
File.Move(fileOnDisk.FullName, fileToMove.FullName);
// Убираем из списка рассматириваемых
files.Remove(fileOnDisk);
// Убираем из описания торрента
torrent.Files.RemoveAt(i--);
break; //Больше искать файл в дереве не надо, можно переходить к следующему в torrent
}
Есть в коде выше три важных для пояснения момента. Начну с двух последних — вот эти строки:
files.Remove(fileOnDisk);
torrent.Files.RemoveAt(i--);
Я посчитал вполне логичным убирать уже отсортированные файлы из рассмотрения, что позволит несколько сократить время выполнения поиска. Во второй строке есть конструкция .RemoveAt(i--);
так как из коллекции убирается текущий элемент, то указатель надо сдвинуть назад, чтобы на следующей итерации цикла брался следующий элемент, а не через один.
Теперь про первый момент. Я знаю про наличие foreach
для списка, но его при использовании нельзя модифицировать этот спикок, то есть мы не сможем удалять уже ненужные более элементы. Итак, собирая все выше описанное в один метод, имеем:
ReadTorrent
public static void FindFiles(Torrent torrent, List<FileInfo> files, string destinationPath, bool copyFile)
{
for (int i = 0; i < torrent.Files.Count; i++)// (LostFile fileInTorrent in torrent.Files)
{
LostFile fileInTorrent = torrent.Files[i];
for (int j = 0; j < files.Count; j++)
{
FileInfo fileOnDisk = files[j];
// Ищем файл с таким же разширением
if (fileOnDisk.Extension != Path.GetExtension(fileInTorrent.Name))
continue;
// Проверяем размер
if (fileOnDisk.Length != fileInTorrent.Length)
continue;
// Проверяем хэш
if (!torrent.CheckHash(i, fileOnDisk))
continue;
// Все проверки пройдены. перед нами искомый файл
// Перемещаем его
FileInfo fileToMove = new FileInfo(destinationPath + @"" + fileInTorrent.Name);
if (!Directory.Exists(fileToMove.DirectoryName))
Directory.CreateDirectory(fileToMove.DirectoryName);
if (!fileToMove.Exists)
{
if (copyFile)
File.Copy(fileOnDisk.FullName, fileToMove.FullName);
else
File.Move(fileOnDisk.FullName, fileToMove.FullName);
// И убираем из списка рассматириваемых
files.Remove(fileOnDisk);
// Убираем из описания торрента
torrent.Files.RemoveAt(i--);
break;
}
}
}
}
Ну вот! Самое вкусное.
Проверка хеша
Как видно из кода выше, для проверки хеша мы передаем имя файла на диске и номер файла в списке файлов торрента. Это надо для того, чтобы не запускать поиск в списке файлов, а сразу взять его по номеру, раз он известен (еще одно «+1» циклу for
).
public class Torrent
{
public string Name;
public int PieceLength;
public char[] Hash;
public List<LostFile> Files;
public string FileName;
public bool CheckHash(int index, FileInfo fileOnDisk) {}
}
Теперь приступим к реализации нашего метода проверки хеша. На данном этапе мы знаем номер в списке файлов торрента и путь до файла на диске
LostFile checkingFile = this.Files[index];
if (checkingFile.Length < this.PieceLength * 2 - 1)
return false;
В принципе, мы можем считать хеш любого файла, но давайте немного упростим себе задачу. Мы будем браться только за файлы, длина которых больше или равна PieceLength * 2 - 1
. Такое ограничение даст нам возможность вычленить хотя бы один кусок для проверки, полность находящийся в файле. У такого подхода есть несколько существенных плюсов:
- Нет необходимости дополнительно искать на диске соседние файлы;
- Длина куска для хеширования очень редко превышает 2-4 МБ, что дает нам еще один плюс — с точки зрения производительности и времени, докачать такие файлы намного проще, чем искать их на диске.
На этом этапе мы подошли к самому сложному из всего, что нам надо было сделать — поиску нужного куска для проверки. Давайте немного отдалимся от программирования и обратимся к математике, сформулировав вспомогательную задачку.
Когда торрент-клиент проводит хеширование файлов, он считает хеш по порядку, однако бывает так, что нет одного или нескольких файлов. Тогда торрент-клиенту надо знать какой следующий кусок брать и откуда он будет начинаться в следующем имеющемся файле. Для вычисления двух этих цифр будем использовать следующий код, в котором переменная firstChunkNumber
содержит номер первого куска, который полностью содержится в данном файле, а bytesOverhead
— количество байт от начала файла до начала этого куска. Для лучшего понимания этого момента взгляните на поясняющий рисунок после кода.
long start = 0;
long firstChunkNumber = 0;
long bytesOveload = checkingFile.BeginFrom % this.PieceLength;
if (bytesOveload == 0) // Если кусок начинается с первого байта файла
{
start = checkingFile.BeginFrom;
firstChunkNumber = checkingFile.BeginFrom / this.PieceLength;
}
else
{
firstChunkNumber = checkingFile.BeginFrom / this.PieceLength + 1;
start = firstChunkNumber * this.PieceLength - checkingFile.BeginFrom;
}
Ответить на вопрос «Почему номер куска разный для случая, когда его начало совпадает с началом файла, и для случая, когда кусок лежит внутри?» предлагается самостоятельно.
Сейчас, зная номер куска мы должны взять его хеш из торрента с помощью такой конструкции:
char[] hashInTorrent = new char[20]; // 20 - длина хеша SHA1 в байтах
Array.Copy(this.Hash, firstChunkNumber * 20, hashInTorrent, 0, 20);
После этого, надо прочитать кусок из файла и посчитать его хеш:
char[] fileHash = new char[this.PieceLength];
using (BinaryReader fs = new BinaryReader(new FileStream(fileOnDisk.FullName, FileMode.Open)))
{
using (SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider())
{
byte[] piece = new byte[this.PieceLength];
fs.BaseStream.Position = start;
fs.Read(piece, 0, this.PieceLength);
fileHash = Encoding.GetEncoding(437).GetString(sha1.ComputeHash(piece)).ToCharArray();
}
}
Ну и самое важное — его проверить. У меня, почему-то не захотел работать ни один из методов Equals()
, которые я смог найти, поэтому проверяем так:
for (int i = 0; i < fileHash.Length; i++)
{
if (fileHash[i] != hashInTorrent[i])
return false;
}
Собирая воедино сие творение возбужденного мозга, получим метод следующего содержания:
CheckHash
public bool CheckHash(int index, FileInfo fileOnDisk)
{
LostFile checkingFile = this.Files[index];
if (checkingFile.Length < this.PieceLength * 2 - 1)
return false;
long start = 0;
long firstChunkNumber = 0;
long bytesOveload = checkingFile.BeginFrom % this.PieceLength;
if (bytesOveload == 0)
{
start = checkingFile.BeginFrom;
firstChunkNumber = checkingFile.BeginFrom / this.PieceLength;
}
else
{
firstChunkNumber = checkingFile.BeginFrom / this.PieceLength + 1;
start = firstChunkNumber * this.PieceLength - checkingFile.BeginFrom;
}
char[] hashInTorrent = new char[20];
Array.Copy(this.Hash, firstChunkNumber * 20, hashInTorrent, 0, 20);
char[] fileHash = new char[this.PieceLength];
using (BinaryReader fs = new BinaryReader(new FileStream(fileOnDisk.FullName, FileMode.Open)))
{
using (SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider())
{
byte[] piece = new byte[this.PieceLength];
fs.BaseStream.Position = start;
fs.Read(piece, 0, this.PieceLength);
fileHash = Encoding.GetEncoding(437).GetString(sha1.ComputeHash(piece)).ToCharArray();
}
}
for (int i = 0; i < fileHash.Length; i++)
if (fileHash[i] != hashInTorrent[i])
return false;
return true;
}
На этой прекрасной ноте, рассказ о методах и алгоритмах заканчивается, и мы переходим к рассказу о реализации в реальной жизни данного творения. Вполне понятно, что данная задача мной решалась не для того, чтобы решить, а для того, чтобы реализовать. Поэтому привожу на суд общественности мое творение, которое реализует все то, о чем написано выше.
Программа
Программа написана, как уже упоминалось на C#. При работе не сильно прихотлива, требует только .NET 2.0. Есть однако одно ограничение на использование: торрент файлы и коллекцию лучше убрать из корня логического диска. Причина этого ограничения — использование при сканировании директорий параметра `SearchOption.AllDirectories`, что приводит к вылету при попытке прочитать закрытые директории типа корзины или `System Volume Information` (если знающие люди подскажут как это обойти, то буду весьма признателен). Для папки назначения особых ограничений естественно нет, главное чтобы влезло, и можно было в нее писать, иначе вылетит с ошибкой (не моделировал, но логично).
В процессе работы, после окончания обработки очередного файла, выводится результат — имя .torrent-файла на диске и количество обработанных файлов.
Чтобы запустить сканирование, необходимо выбрать три директории (с файлами .torrent, с файлами для сортировки и папку для отсортированного), по желанию указать две опции и запустить сканирование.
По поводу производительности. Она пока что низкая: обработка 10 больших torrent-файлов заняла около 5 минут.
Так как работает приложение в один поток, то во время выполнения интерфейс подвисает, но я над этим работаю. Также хочу напомнить, что файлы малого размера (меньше 2-х мегабайт) не будут перемещены по причине отсутствия возможности проверки хеша. Вполне вероятны ложные срабатывания из-за того, что проверяется только один кусок под номером firstChunkNumber
. Пока что проверять все куски слишком затратно, но в планах есть.
Не ищите торренты рекурсивно, если они собраны в корне диска.
Копирование может занять много времени, поэтому интерфейс может подвиснуть — не пугайтесь.
Так как писалась эта программа 4fun, то качество кода там немного не то, которое хотелось бы, но у меня оно работает. Данная программа не тестировалась, исправлялись только очевидные ошибки, поэтому могут быть, да что скрывать-то, есть скрытые баги. ИСПОЛЬЗУЯ ДАННУЮ ПРОГРАММУ, ВЫ ИСПОЛЬЗУЕТЕ ЕЕ НА СВОЙ СТРАХ И РИСК.
Взять исходники можно на github. Распространяется по GPLv2. Там есть архив с исполняемым файлом. Для работы требуется библиотека Bencode Library, но не оригинальная, а модифицированная мною (есть у меня в репозитарии, подключена субмодулем).
Спасибо всем, кто проявил терпение и дочитал эту статью до конца. Рад услышать ваши вопросы, приветствуется всевозможная помощь в совершенствовании алгоритма и, в особенности, кода.
Источники: BitTorrentSpecification.
UPD1. По результатам обсуждения мне стало понятно, что правильней будет не ломать существующие коллекции выдергиванием файлов на раздачу, а наоборот — создавать хардлинки в нужном для раздачи месте на файлы внутри упорядоченных коллекций (фильмо и дискографий, например). В дальнейшем программа будет работать именно так.
UPD2. Если у тех, кто пользовался этой утилитой, есть еще какие-то пожелания по функционалу или баг репорты, то прошу оставлять их на github в issue-трекере.
-
Обзоры
47
-
Видео
17
-
Вопросы
77
-
Статьи
11
Лучшие программы поиска торрентов и другие секреты нахождения нужных файлов
В этой статье мы попробуем разобраться, какая программа для поиска торрентов в Интернете способна удовлетворить запросы прихотливых пользователей. Вы узнаете, с чем удобнее искать и какими программами лучше скачивать торренты, а также где просматривать информацию о торрент-файлах перед загрузкой.
Большинство новых фильмов, сериалов, игр и ПО появляются, в первую очередь, на торрент-трекерах. Чтобы быстро их найти и так же быстро скачать, вам понадобится специальная программа — торрент-клиент. Ниже мы рассмотрим топовые программы и выясним, в которых из них поиск и опции для закачки реализованы в оптимальном варианте.
9.7
Интерфейс
Функционал
Удобство
Программа обладает продуманным поиском — начните вводить название искомого торрент-файла, и вы тут же увидите доступные варианты. Зачастую в них уже указано качество, а также количество звездочек — чем их больше, тем скорее файл будет сохранен на компьютере.
В MediaGet также встроен медиаплеер, благодаря чему фильмы можно просматривать фильмы еще до того, как они закачаются целиком.
9
Интерфейс
Функционал
Удобство
А вот пример самой популярной программы для поиска и загрузки торрент файлов. Хотя, нужно сказать, что функция поиска здесь реализована не лучшим образом. Фактически, это интегрированные поисковые механизмы — вы можете выбрать InfoSpace, Google, Bing или BitTorrent. Мы рекомендуем использовать последние две, поскольку остальные предоставляют ссылки не на торренты, а, скорее, ответы на стандартные поисковые запросы.
С uTorrent вы сможете составить расписание загрузок, расставлять приоритеты, приостанавливать и возобновлять закачки, а также раздавать собственные файлы.
8.3
Интерфейс
Функционал
Удобство
BitTorrent — старейший из всех торрент-клиентов. Отличается стабильностью и малой нагрузкой на систему — в частности, работа приложения не сказывается на запущенном браузере или игре. Так же, как и в uTorrent, предусмотрен поиск торрент-файлов по выбранной поисковой системе.
В сравнении с uTorrent приложение обладает не столь широким функционалом. Однако именно отсутствие множества настроек и упрощенный интерфейс привлекает многих неискушенных пользователей. В дополнение ко всему BitTorrent позволяет настроить выключение компьютера по завершению загрузок.
7.7
Интерфейс
Функционал
Удобство
А вот еще один торрент-клиент, который, кроме прочего, способен работать через прокси. Он характеризуется несколько перегруженным интерфейсом, а также тем, что некоторые трекеры блокируют его работу. Вместе с тем, программа позволяет значительно увеличить скорость загрузки по сравнению с аналогами. Вот за это многие её и выбирают.
Что касается поиска, то он у BitComet также не свой — тут придётся полагаться на интегрированные поисковые системы.
8.3
Интерфейс
Функционал
Удобство
Эта программа считается достаточно мощным BitTorrent и P2P-клиентов, поскольку работает со всеми распространенными протоколами, предназначенными для закачки файлов из Сети. В их числе BitTorrent, eDonkey и Gnutella. Возможна загрузка файлов из разных протоколов одновременно. Расширенный поиск позволяет находить файлы не только на web-серверах, но и на компьютерах обычных пользователей. При этом можно выставить такие критерии как протокол, размер, тип. Каждый поиск выполняется в отдельном окне — таким образом, вы не потеряете то, что искали. Доступны рейтинги и описание. Возможен предпросмотр во встроенном плеере.
9
Интерфейс
Функционал
Удобство
Vuze может выступить достойной альтернативой uTorrent, поскольку кроме стандартных опций предлагает также подписку на выход новых эпизодов сериалов или телешоу, быстро отправлять загруженные файлы на мобильные устройства и проигрывать фильмы в HD-плеере.
А самое главное — вы сможете воспользоваться интеллектуальным метапоиском, который предоставляет исключительно ссылки на торренты. Вы сразу сможете увидеть размер, качество и рейтинг интересующих файлов.
9.3
Интерфейс
Функционал
Удобство
Эту программу можно смело назвать целым медиацентром, в котором загрузка и просмотр видео реализовано на высшем уровне. Zona собирает файлы со всех популярных торрент-трекеров и объединяет их в собственном каталоге. Поиск можно вести как по названию фильма или сериала, так и по актёру или режиссёру.
Разработчики предоставили пользователям возможность смотреть телеканалы онлайн и слушать радиостанции.
8.7
Интерфейс
Функционал
Удобство
Возможности HAL действительно впечатляют — программа обладает мощным функционалом для поиска, сохранения и загрузки торрент-файлов. Поиск торрент-файлов в ней ведется одновременно по всем нескольким трекерам — а вы можете указать, какие именно стоит сканировать. Особенно удобно то, что от пользователя не требуется авторизация на сайтах-трекерах, даже на rutracker.org или tfile.me. То есть, беспокоиться о рейтинге тоже не стоит. Приложение позволяет совершать бесконечное множество загрузок в день.
Перед тем как искать торрент файлы в Интернете, имейте в виду — чтобы получить ожидаемый результат, необходимо воспользоваться именно поиском по торрентам. Наилучшим образом эта опция реализована в MediaGet, Vuze и Zona. Несмотря на обилие торрент-клиентов, большинство пользователей предпочитают находить торрент-файлы в поисковых системах, в частности в Google. В этом случае мы рекомендуем водить запрос «filetype:torrent» и затем добавить к нему название интересующего файла. Это будет эффективнее, чем ввести название файла и добавить слово «торрент».