Статья опубликована ровно месяц назад LiveDC – Быстрый доступ к p2p-файлам .
Его смысл в том, что Эрти_Хаквард написал клиент DC с возможностью просмотра файлов до их окончательной загрузки.
С его помощью можно, например, смотреть фильмы через пару минут после начала загрузки, перематывать их назад или смотреть с любого момента.
Или вы можете извлечь нужный файл из большого архива, не скачивая весь архив.
Мне очень понравилась идея этой программы.
Но он написан на C#.
Я хотел бы использовать его в Linux. Поэтому, с разрешения автора, я с большим удовольствием создал подобную программу для Linux. В результате получается консольный битторрент-клиент QLiveBittorrent.
Как это работает О том, как работает QLiveBittorrent, я расскажу на примере загрузки фильма.
Ну, например, мой друг выложил в сеть видео выпускного вечера, который недавно прошел в нашей школе, и мне хочется скачать его и еще раз насладиться этим незабываемым зрелищем.
Я начинаю скачивать фильм.
Указываю папку, куда его следует смонтировать.
И тогда я пытаюсь его открыть.
Фильм открывается через 1-2 минуты, в зависимости от скорости.
Начинаю смотреть - лагов как правило нет, если скорость достаточная.
Далее я перематываю фильм на середину.
Я наблюдаю за тормозами ~30 секунд и продолжаю смотреть с середины.
Происходит нечто подобное.
Изначально, когда фильм открывается в плеере, программа загружает несколько первых блоков фильма и последний блок, чтобы получить информацию о его продолжительности.
Затем она продолжает загрузку фильма с самого начала.
Но в момент перемотки фильма на середину программа начинает скачивать именно тот блок, который был запрошен плеером.
Помимо скачивания фильмов, программу можно использовать для работы с архивами, iso-образами, а также для просмотра папок с огромным количеством картинок.
Очень удобно начать скачивание архива и с самого начала, не дожидаясь его скачивания, открыть его, сразу указать, какой файл вам нужен, и скачать его.
Как все началось После того, как я понял, что проще написать свой, чем пытаться портировать LiveDC на Linux, я сразу приступил к разработке.
Сначала я думал о том, чтобы встроить свою функциональность в мой любимый битторрент-клиент .
Но после просмотра исходников это желание пропало.
Миллионы файлов, повсюду определения для разных систем, все в виде листа, и ничего не понятно.
Однако, вдохновившись qbittorrent, я выбрал тот же набор инструментов.
Драйвер файловой системы был написан за день qlive .
Очередной день - графика и скачивание торрентов.
Это выглядело примерно так:
На этом этапе развитие застопорилось.
Программа работала, скачивала нужные куски, но регулярно получала SIGSEGV (ошибка «программа обратилась не по тому адресу»).
При этом я с грустью посмотрел на функционал qbittorrent И uTorrent , и до меня постепенно дошло, что мне не хватает энтузиазма на месяцы разработки.
Второе дыхание Второе дыхание открылось, когда я решил отказаться от графического интерфейса.
Кому это нужно? Чтобы поддержать его, нужно слишком много нервов! Так появился консольный битторрент-клиент. И тут появилась интересная идея отделить раздачу торрентов от скачивания.
В результате программа оказалась разделена на скачивающую часть, которая умеет монтировать нескачанные файлы, ограничивать скорость скачивания и выступать в роли обычного торрент-клиента, и раздающую часть (сид-менеджер), которая может раздавать то, что было загружено, а также ограничить скорость загрузки.
Интересные точки развития
- Иногда, тестируя загрузку торрентов, я с удивлением обнаруживал, что скорость загрузки превышала максимальную скорость моего роутера — 802.11G ~2МБ/с.
Она достигала 40-50 МБ/с, что было в принципе невозможно! Я пытался свалить все на тайники.
Однако оказалось, что у меня на компьютере было запущено 2 клиента, которые обменивались между собой информацией со скоростью чтения жесткого диска.
Один читает, другой пишет. Впоследствии я использовал это для тестирования.
- В связи с тем, что клиент консольный, пришлось разобраться с сигналами завершения.
Я добавил обработку сигнала SIGTERM (сигнал запроса завершения процесса).
Во время отладки, когда я отправил SIGTERM вручную, он был успешно перехвачен и обработан.
Однако на практике, когда я нажимал в терминале ctrl-c, сигнал не обрабатывался.
Оказалось, что терминал отправлял не SIGTERM, а SIGINT (сигнал пользователю на остановку процесса с терминала).
Это меня поразило.
Оказывается, при нажатии ctrl-c сигнал не «остановить процесс», а «пользователь хочет, чтобы процесс остановился».
Вероятно, можно было придумать более глубокий смысл различия этих процессов, но он был весьма неожиданным и странным.
- Несмотря на то, что клиент консольный, хотелось, чтобы какое-то подобие GUI осталось.
Но если приложение консольное, то вы хотите, чтобы оно запускалось в голой консоли (TTY), а с GUI это невозможно.
Или можно? Для этого вам нужно понять, как работает графика в Linux. А работает это примерно так: есть X-сервер, есть клиенты.
В какой-то момент клиент подключается.
Вопрос – когда это произойдет? ?Экспериментальным путем (присмотревшись) я выяснил, что подключение происходит в момент создания QПриложение .
Соответственно, если нужна графика, то я создаю QПриложение , если не - QCoreПриложение .
Таким образом, программу можно запустить как в голой консоли, так и с мини графическим интерфейсом.
- Смешивать Qt и libtorrent — это настоящий ад. Нервы мои наконец сдали и я начал пытаться перевести всё на Qt. К сожалению, libtorrent использует std, поэтому весь мой код покрыт QString::fromStdString(string) и QString.toStdString(), а также преобразованиями векторного символа, QVector char, QByteArray и т. д.
- Во время разработки я столкнулся с досадной проблемой.
В какой-то момент к программе подключаются медленные пиры и потихоньку начинают отдавать нужные куски.
При этом в среднем скорость загрузки хорошая, но задержки из-за них недопустимы.
Я пытался с этим бороться.
В какой-то степени проблема решилась за счет того, что программа ищет быстрые пиры первые 2 минуты, а затем ограничивает их максимальное количество пятью пирами.
Это позволяет вам отключить большинство медленных узлов.
- Чтобы избежать проблем с вычитанием времени после полуночи, в программе реализована функция Midnight(), которая каждую секунду проверяет, наступила ли полночь? В течение 5 секунд после полуночи программа выходит из строя - при обновлении информации на экране она сбрасывает все счетчики времени, игнорируя запросы пользователей.
Это такой редкий костыль.
Я написал это за 3 минуты до полуночи.
- Если торрент только что опубликован, то соотношение количества сидеров и личеров слишком мало.
Это влечет за собой практически полную невозможность скачать такой торрент за разумное время.
Поэтому в QLiveBittorrent добавлена возможность «превращаться» в обычный торрент-клиент. Для этого нажмите клавишу «а» (английская).
- При чтении смонтированных файлов программы впадают в ступор, пока не скачаются нужные куски.
Но они обязательно выходят из этого, когда это происходит. Это особенность программы.
- Авторитетные источники утверждают, что на канале 600Кб/с фильм 1.45G с внешней звуковой дорожкой и субтитрами воспроизводится без лагов.
- Если нажать ctrl-c на клавиатуре (или отправить SIGTERM), программа начнет завершать работу — сбрасывать данные на жесткий диск и отправлять информацию трекерам.
После сброса данных можно нажать ctrl-c — тогда информация не будет отправляться на трекеры.
Это сделано потому, что меня очень расстраивают программы, которые невозможно завершить.
- Эрти_Хаквард - оригинальная идея
- ксимера — рассказал о том, как парсить параметры из командной строки.
- статья о boost::program_options
- API libtorrent — хорошая библиотека, но эмоции от одностраничной документации неописуемые.
- github.com/qbittorrent/qBittorrent — Я прочитал исходный код, но ничего не понял.
Настройки хранятся по адресу ~/.
qlivebittorrent УПД 00:30 Забыл описать еще две особенности:
- После скачивания торрента он автоматически добавляется в список раздачи.
Если сид-менеджер уже запущен, он будет добавлен в список в течение 10 минут.
- Если торрент был удален, он будет удален из списка раздачи по первому запросу.
Версия OpenSUSE УПД 23:15 В опубликованной версии графический интерфейс не работал.
Я так и не понял в чем ошибка, но нужный костыль нашелся.
Файлы были перезагружены.
UPD + месяц DAP-Тьма опубликовал версии для Debian, Ubuntu и Fedora. Спасибо.
Дебиан и Убунту Федора Теги: #BitTorrent #P2P #linux #Qt #консоль #Qt
-
Кирена Школа
19 Oct, 24 -
Домен Inferno - Поиск Свободных Доменов
19 Oct, 24 -
Fireftp: Расширение Firefox
19 Oct, 24 -
Сцена №11
19 Oct, 24 -
Обзор Стандартных Форматов Cades
19 Oct, 24