2014-03-16 3 views
2

Теперь я использую Socket SendFile API, чтобы отправить файл или его часть в любые сети. Могу ли я сделать этот процесс быстрее по сравнению с lan? Я знаю о таких программах, как TeraCopy, что значительно ускоряет процесс копирования файлов по локальной сети (некоторые говорят об ускорении 2 раза) по сравнению с обработчиком Windows Explorer, который использует API CopyFile (я думаю). Я не знаю, как они это делают. Не могли бы вы мне посоветовать?Каков самый быстрый способ передачи данных по локальной сети?

+0

Вы обнаружите, что TeraCopy, вероятно, все еще использует библиотеку Win32 'FileCopy'. Нет простого способа улучшить работу сети «точка-точка», и я бы доверял разработчикам Windows/Samba оптимизировать свой код низкого уровня, чтобы сделать это хорошо. Лучшее, на что можно надеяться, это оптимизация очереди файлов. – Xenolightning

+1

@Xenolightning после некоторого искажения a видеть, что есть много более быстрого файлового trasfer, а затем стандартный TCP для разных условий: для большого количества небольших файлов - во-первых, для больших файлов по высокоскоростной сети с высокой задержкой - второй, для больших файлов выигрывать высокоскоростные сети с низким уровнем латентности - третье ... все, что нужно ... –

+0

У вас есть два вопроса: «Могу ли я сделать этот процесс быстрее по LAN?» Очевидный ответ - «Да». Затем вы спрашиваете, как работает TeraCopy, что я использовал в качестве контекста для вашего «реального» вопроса. Возможно, вы пересмотрите свой вопрос на что-то вроде «Я хочу передавать файлы по сети, как это сделать, чтобы максимально увеличить скорость передачи?» – Xenolightning

ответ

0

Одним из способов ускорения копирования файлов было бы сделать это через UDP вместо TCP. Тогда проблема заключается в том, чтобы выполнить проверку ошибок (поскольку UDP не гарантирует, что пакет прибывает неповрежденным или в порядке).

Проводник Windows Explorer медленный, потому что он открывает каждый файл отдельно, копирует его и закрывает (по крайней мере, насколько мне известно).

Ваш вопрос действительно не дает никакого кода, поэтому немного сложно ответить «правильно».

+0

UDP - это ужасный способ скопировать файлы, накладные расходы намного превосходят любые предполагаемые сбережения в квитировании и т. Д. Файлы представляют собой последовательные потоки двоичных данных, именно то, что предназначено для TCP. – Ashigore

+0

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

+0

Вот что я нашел http://en.wikipedia.org/wiki/UDP-based_Data_Transfer_Protocol. Он основан на UDP, как и некоторые другие протоколы, оптимизированные для больших передач файлов в высокоскоростных глобальных сетях, которые больше влияют на это, чем на TCP. Но плохой идеал написать такой протокол на udp самостоятельно в каком-то общем приложении ... слишком много работы. –

2

Вы можете сжимать данные «на лету», а затем распаковывать их после отправки по сети.

GZipStream подходит для такого рода вещей, а также приведены основные примеры сжатия/распаковки.

Сжатие, конечно же, заставит вас получить удар производительности процессора, но вам придется передавать меньше данных, что позволяет сократить время передачи. Самое приятное в этой библиотеке, что сжатие работает с потоками. Таким образом, вы можете транслировать по сети, не дожидаясь сжатия всего файла.

+0

Это не сработает, если у вас не было другого демона, работающего в пункте назначения, для декомпрессии потока. В противном случае вам придется распаковать поток перед вызовом API 'CopyFile'. Или в худшем случае, записывая сжатый файл в пункт назначения, а затем читать и записывать его для его распаковки. – Xenolightning

+0

Вы правы, но вопрос не очень точный о том, как должна произойти передача. Поэтому я сделал предположения. – Andreas

Смежные вопросы