Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Winsock Transmit File

15K
11 апреля 2007 года
-LD-
28 / / 14.03.2007
Привет. В сетевой проге нужно реализовать передачу файлов.
Как это будет удобнее сделать? Меньше мороки?
Знаю есть функция Transmit File на передающей стороне, а на принимающей должна стоять обычная recv? Reсv способна принять файл, например, размером 5мб, если я его посылаю тарансмитом?
Или там надо будет реализовать "умный" прием?
239
18 апреля 2007 года
Dolonet
1.7K / / 20.05.2000
Возможно, имеет смысл перенести эту тему в специальный форум, например, Borland C++? Там больше шансов, что ответят компетентно.
На каком языке программирования Вы реализуете данный функционал?
2
18 апреля 2007 года
squirL
5.6K / / 13.08.2003
recv не способна принять файл. необходимо организовать контроль за количеством принимаемых байт. потому что нет гарантии, что ты примешь при чтении из сокета столько, сколько пошлешь.
353
25 апреля 2007 года
Nixus
840 / / 04.01.2007
Если создан TCP сокет, то send и recv легко передадут любой поток байтов и сами проведут контроль целостности.
2
26 апреля 2007 года
squirL
5.6K / / 13.08.2003
Цитата: Nixus
Если создан TCP сокет, то send и recv легко передадут любой поток байтов и сами проведут контроль целостности.


передать то передадут. только вот что вы понимаете под контролем целостности? если то, что recv & send гарантируют прием/передачу всех данных, что вы послали - то нет, это неверно.

353
26 апреля 2007 года
Nixus
840 / / 04.01.2007
Цитата: squirL
только вот что вы понимаете под контролем целостности? если то, что recv & send гарантируют прием/передачу всех данных, что вы послали - то нет, это неверно.


Вообще-то гарантируют, на то он и TCP, чтобы контролировать дошла ли порция данных до другого узла и отправлять потерянный пакет еще раз. Еще раз повтарюсь речь идет о TCP сокете. Дейтаграммные сокеты такого не гарантируют.
Конечно вероятность что что-то дойдет в искаженном виде есть, т.к. контроль осуществляеться по средствам CRC, но вероятность эта крайне мала.

2
26 апреля 2007 года
squirL
5.6K / / 13.08.2003
вот про это я и говорил. формулировка "TCP гарантирует доставку данных" - вводит в заблуждение. на самом деле - гарантируется только доставка уже подтвержденных ack'ом данных. пример - клиент посылающий серверу простейшие строки, которые читает с ввода. если сервер перезапустится в момент, когда клиент висит в блокирующем вводе? куда денется посланная строка? ;)
далее. автора интересует передача файла. как я писал -
Цитата:
необходимо организовать контроль за количеством принимаемых байт.


recv - вполне способна прочитать меньше байт чем послал send или больше. это особенности реализации TCP. поэтому - если мы пересылаем данные, надо самостоятельно реализовывать контроль за принимаемым потоком данных.

353
26 апреля 2007 года
Nixus
840 / / 04.01.2007
Цитата: squirL
вот про это я и говорил. формулировка "TCP гарантирует доставку данных" - вводит в заблуждение. на самом деле - гарантируется только доставка уже подтвержденных ack'ом данных. пример - клиент посылающий серверу простейшие строки, которые читает с ввода. если сервер перезапустится в момент, когда клиент висит в блокирующем вводе? куда денется посланная строка? ;)


Я прекрасно знаю как работает TCP. Если сервер повиснет, то клиент повисит и произойдет разеъдинение по таймауту. revc и send об этом уведомляют прекрасно и бояться нечего.

Цитата: squirL

далее. автора интересует передача файла. как я писал -
recv - вполне способна прочитать меньше байт чем послал send или больше. это особенности реализации TCP. поэтому - если мы пересылаем данные, надо самостоятельно реализовывать контроль за принимаемым потоком данных.


Ну если речь об этом, то согласен. send добавляет данные в буффер, который потом по кусочкам отправляеться на другую сторону, recv работает аналогично у принимающей стороны. Поэтому одна порция данных, отправленная send'ом, может стать двумя для recv. Решение простое - в цикле принимать сколько примится и добавлять к буферу, или сразу писать в файл. В нем же проверять на дисконнект.

2
26 апреля 2007 года
squirL
5.6K / / 13.08.2003
Цитата: Nixus
Я прекрасно знаю как работает TCP. Если сервер повиснет, то клиент повисит и произойдет разеъдинение по таймауту. revc и send об этом уведомляют прекрасно и бояться нечего.


ну я говорю не про зависание, а про падение сервера. и моментальный перезапуск. при котором не происходит отправки FIN. клиент просто не узнает о падении и будет слать по уже несуществующему коннекту пакеты, до получения RST.

Цитата: Nixus

Ну если речь об этом, то согласен. send добавляет данные в буффер, который потом по кусочкам отправляеться на другую сторону, recv работает аналогично у принимающей стороны. Поэтому одна порция данных, отправленная send'ом, может стать двумя для recv. Решение простое - в цикле принимать сколько примится и добавлять к буферу, или сразу писать в файл. В нем же проверять на дисконнект.


решение - либо посылать вместе с пакетом размер переданного буфера - как часть данных, и на приеме вытягивать этот размер и читать данные до получения всего что послано (как делает BIND, например), либо использовать функции, которые самостоятельно разбивают данные на строки (типа fgets)

563
26 апреля 2007 года
MrLinker
249 / / 17.09.2006
функция Transmit File только в мастдае работает, посему лучшее решение предложено пенсионером форума. Передавай сначала размер данных, а потом в цикле считывай при помощи recv.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог