Отправка содержимого файла клиенту - PullRequest
3 голосов
/ 29 марта 2010

Я пишу приложение на C ++, называемое цитатой дня. Я использую библиотеку winsock2. Я хочу отправить содержимое файла обратно клиенту, включая новые строки, используя функцию отправки. То, как я это попробовал, не работает. Как мне это сделать?

Ответы [ 3 ]

3 голосов
/ 29 марта 2010

Чтение файла и запись в сокет - это две разные операции. Winsock не имеет API для прямой отправки файла.

Что касается чтения файла, просто убедитесь, что вы открываете его в режиме чтения двоичных файлов при использовании fopen, или просто используйте CreateFile и ReadFile Win32 API, и он будет двоичным режим по умолчанию.

Обычно вы будете читать файл порциями (например, 10 КБ за раз), а затем отправлять каждый из этих порций через сокет, используя send или WSASend . Как только вы закончите, вы можете закрыть сокет.

На принимающей стороне читайте все, что доступно на сокете, пока сокет не закроется. Когда вы читаете данные в буфер, запишите количество прочитанного в файл.

0 голосов
/ 29 марта 2010

Я рекомендую сбросить winsock и вместо этого использовать что-то более современное, такое как Boost.Asio:

http://www.boost.org/doc/libs/1_37_0/doc/html/boost_asio/tutorial.html

Существует также пример передачи файла:

http://www.boost.org/doc/libs/1_37_0/doc/html/boost_asio/examples.html

0 голосов
/ 29 марта 2010

Хм ... Я думаю, что в Win32 должно быть что-то похожее на "sendfile" в Linux. Если этого не произойдет, вы все равно можете использовать отображение памяти (но не забывайте обрабатывать файлы размером больше доступного виртуального адресного пространства). Вам, вероятно, потребуется использовать блокирующие сокеты, чтобы избежать возврата в приложение до тех пор, пока все данные не будут использованы. И я думаю, что было что-то с «перекрытой» операцией для реализации асинхронного ввода-вывода.

...