Мне нужно реализовать систему промежуточного программного обеспечения для совместного использования файлов, и он должен разделить файлы, аналогично тому, что происходит на bittorrent, где он отправляет и получает отдельные части одновременно из различных источников. Как я могу это сделать? Это библиотека или я должен сам реализовать разделение файлов?





Разделите файлы на блоки, скажем, по 100 КБ каждый. Затем вычислите хэш SHA (или какой-либо другой алгоритм хеширования) для каждого из блоков. поэтому, если размер файла составляет 905 КБ, у вас будет рассчитано 10 таких хэшей.
Сервер будет содержать файл определения хэша для каждого файла, который он обслуживает. Этот файл определения хэша будет содержать список всех блоков файла вместе с хешем. Итак, если сервер обслуживает наш файл размером 905 КБ с именем test.exe. Затем у нас будет другой файл с именем test.exe.hashes, который содержит список 10 хэшей файла.
Клиент загрузит файл определения хэша и убедится, что в нем есть все блоки. Клиент может запросить каждый блок индивидуально, и после его загрузки он может снова вычислить хэш на своем конце, чтобы убедиться в отсутствии повреждений.
Вам не нужно физически разделять файл, разделение файла - это просто чтение той его части, которая вас интересует. Первый блок файла находится в диапазоне байтов от 0 до 102399, следующий блок - от 102400 до 204800, и так далее. Так что просто откройте файл, найдите эту позицию, прочтите данные и закройте файл.
Посмотрите на реализацию Split и Concat (программное обеспечение GNU).
Возможно, вы захотите рассмотреть возможность использования кодировки Соломона-Рида. Это значительно упростит получение последних блоков. Это путь, по которому Microsoft пошла в Avalaunch.
Из интереса: почему бы просто не реализовать BitTorrent или что-то в этом роде? Существует много клиентов с открытым исходным кодом (например, Azureus), а протокол - действительно просто. Также есть статья с более подробной информацией, но он содержит некоторые расширения - сомнительно, официальная спецификация всегда верна.