2015-12-13 1 views
0

Я работаю над программой обмена файлами P2P и, чтобы передавать файлы в маленьких битах, мне нужно как-то разделить загруженный файл. Теперь я создал программу, которая разбивает файл на небольшие файлы и помещает их в папку с использованием класса C# Stream, а также может перестраивать его. Однако это неэффективно и занимает много времени. Я думал о чтении данных из потока со смещением в соответствии с запрошенным файлом и последующей отправкой его без сохранения. Однако я не знаю, как добавить его на принимающую сторону в правильном порядке, поскольку данные не будут отправляться по порядку.Лучший способ разделить файлы на пакеты с размером пакета UDP для совместного использования файлов peer to peer?

На стороне примечания, как bitTorrent выполняет такую ​​функциональность?

спасибо

+1

Не храните куски. Это не нужно, как вы обнаружили. Вам необходимо разработать сетевой протокол, который позволяет другой стороне восстановить файл. Возможно, вы должны использовать TCP. – usr

+0

_ «как битТоррент делает это» _ - идите читать спецификации. Боюсь, это слишком велико, чтобы ответить. – CodeCaster

+0

@usr хорошо, если куски должны были прийти в порядок, было бы легко собрать их один за другим. Однако на самом деле клиент получит разные куски у разных аналогов. Я могу сделать его более эффективным, если я не деконструирую файл, а отправлю его части со смещением в потоке данных, но получающему концу все равно придется сохранять куски, а затем перестроить файл. Я предполагаю, что это возможно, так как ему все равно придется хранить эти данные, а затем, когда он перестраивает его, он удалит куски, и если он захочет продолжить семена, он будет работать как исходный загрузчик. – Foxman

ответ

1

Получателю необходимо хранить куски. Отправитель не делает этого. Вероятно, вы должны создать весь файл на нулевом ноте, инициализированный на диске. Затем вы можете заполнить отверстия, когда вы их получите. Вам нужна отдельная структура, чтобы отслеживать, какие диапазоны еще есть, например List<Tuple<int, int>>.