Модераторы: feodorv
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Передача файлов через Win Sockets, Есть идеи? 
:(
    Опции темы
Pilligrim
  Дата 28.10.2006, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 9.6.2006

Репутация: нет
Всего: 1



       У меня есть, но как-то воплотить её не так уж легко. Суть: выбираем файл. Берем с него инфу: размер имя. Делим на пакетики по 1,5 Kb(так нужно). И шлем их по очереди. Как только один доходит до пункта назначения, последний рапортует типа: пакет пришел давай следующий. Отправитель шлёт следующий и так до тех пор пока весь файл не перешлем. 
       Вроде легко, но на практике не очень. Может есть более легкая схема? Подскажите плиз))
PM MAIL   Вверх
ptr
Дата 29.10.2006, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 661
Регистрация: 31.5.2006
Где: Новосибирск

Репутация: 9
Всего: 14



Цитата(Pilligrim @  28.10.2006,  23:40 Найти цитируемый пост)
Вроде легко, но на практике не очень. Может есть более легкая схема?

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


--------------------
Единственный способ определить границы возможного - это выйти за эти границы, в невозможное.
Артур Кларк.
PM MAIL ICQ   Вверх
Pilligrim
Дата 29.10.2006, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 9.6.2006

Репутация: нет
Всего: 1



Да в общем проблемы решаемы, и я их решаю, просто отлаживать долго и много. Вот и хотел спросить: есть ли что полегче) Ну да ладно. Еще вопрос есть:
Если я хочу передать например 3 МБ. Можно ли мне в send() указать размер буфера скажем этих же 3 МБ? Отправится ли пакет такой величины? И если да, то как мне его принимать? Ведь он же придет на комп приемник по частям. Подскажите.
PM MAIL   Вверх
ptr
Дата 30.10.2006, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 661
Регистрация: 31.5.2006
Где: Новосибирск

Репутация: 9
Всего: 14



Цитата(Pilligrim @  29.10.2006,  23:51 Найти цитируемый пост)
Если я хочу передать например 3 МБ. Можно ли мне в send() указать размер буфера скажем этих же 3 МБ? Отправится ли пакет такой величины?

Есть ли ограничения на размер посылаемых данных в send() я не знаю, никогда над этим вопросом не задумывался smile . Скорее всего зависит от архитектуры. Под windows я видел примеры посылки больших файлов в send. Никто посылать пакет размером 3MB не будет, весь буфер будет разбит на маленькие пакеты.

Такой способ посылки лучше не использовать.


Цитата(Pilligrim @  29.10.2006,  23:51 Найти цитируемый пост)
 И если да, то как мне его принимать? Ведь он же придет на комп приемник по частям.

Ну и принимай по частям.

Это сообщение отредактировал(а) ptr - 30.10.2006, 10:46


--------------------
Единственный способ определить границы возможного - это выйти за эти границы, в невозможное.
Артур Кларк.
PM MAIL ICQ   Вверх
Олег2005
Дата 30.10.2006, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 421
Регистрация: 26.5.2005
Где: Рига Латвия

Репутация: 6
Всего: 11



Цитата(Pilligrim @  29.10.2006,  19:51 Найти цитируемый пост)
Можно ли мне в send() указать размер буфера скажем этих же 3 МБ? Отправится ли пакет такой величины? И если да, то как мне его принимать? Ведь он же придет на комп приемник по частям. 

Надо хорошо себе представлять, что делает send().
Вы указываете буфер любого размера - send() передает содержание этого буфера в буфер передачи модуля TCP. Размер этого буфера тоже в принципе можно устанавливать с помощью опции SO_SNDBUF функции setsockopt().
Но в сеть все равно будут уходить IP-пакеты, содержащие не более 1460 байт данных, так как для Эзернета MTU равно 1500 байт.
Поэтому на send() программа будет висеть до тех пор, пока все вот так поэтапно не передастся на тот конец - если не сделать сокет неблокирующим или применить асинхронную функцию WSASend()
Насчет принимать - беспокоиться не стоит - на той стороне будут висеть на recv() до тех пор, пока не придет сегмент FIN, означающий конец предачи, и recv() вернет при этом 0.
PM MAIL WWW MSN   Вверх
max0257
Дата 30.10.2006, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 30.10.2006

Репутация: нет
Всего: нет



А рапортовать-то зачем?  smile  TCP сам по себе управляет очередностью пакетов, то есть на выходе из сокета на приемной стороне уже "выпрямленный" поток байт, избавленный от ошибок и дупликатов, клиенту достаточно считывать его и все. То есть сервер читает файл по сколько-то там килобайт и пишет его в сокет, а клиент его читает и пишет, например, в файл на своей стороне
PM MAIL   Вверх
ptr
Дата 2.11.2006, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 661
Регистрация: 31.5.2006
Где: Новосибирск

Репутация: 9
Всего: 14



Цитата(max0257 @  30.10.2006,  20:40 Найти цитируемый пост)
А рапортовать-то зачем?

Всё зависит от задачи. Если, например, закончилось место на диске или что-нибудь другое случилось, то лучше передавать серверу/клиенту об ошибке. Иногда это проще сделать именно так, как было сказано.


--------------------
Единственный способ определить границы возможного - это выйти за эти границы, в невозможное.
Артур Кларк.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0566 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.