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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> вопрос по WSASend, overlapped модель  
:(
    Опции темы
12usver12
Дата 19.1.2012, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Использую в своей программе overlapped модель с callback/completion routines  - с калбэками вообщем, особенность в том что в функциях WSARecv/WSASend в 
последнем параметре указываются калбэки на события отправки/получении данных, соответственно эти операции заканчиваются моментально с успехом 
или ошибкой wsa_io_pending (в процессе выполнения). Интересует нужно ли при WSASend напр
Код

WSASend(Socket, &sendBuffer, 1, &SendBytes, 0, (LPWSAOVERLAPPED)&Overlapped, OnSend)
 
в обработчике события OnSend вести учет отправленных данных ? 
аля 
Код

if (cbTransfered < NeedToSend ) WSASend(тут остаток пуляем...) 

?
Хотя overlapped модель специфическая при wsasend данные копируются сразу во внутренний буфер транспортного провайдера , т.е. как бы гарантируется отправка (или нет ?) 
и после окончания полной отправки выкинет на OnSend. Проводил эксперимент на локальной машине отправку 100 мб файла - все так и было, в OnSend показало что отправилось все 100 
PM MAIL   Вверх
hawk3500
Дата 19.1.2012, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Надо учитывать , но по другому.
Вот линк:
http://forum.sources.ru/index.php?showtopic=170146
Там Олег2005 приводит доку в которой есть пример интересующего Вас вопроса.
--------------------
воин dzen'a
PM MAIL   Вверх
12usver12
Дата 19.1.2012, 23:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



просмотрел , много общих понятий по перекрытым сокетам , но конкретно по моему вопросу нет к сожалению... но сдается мне что все-таки нужен контроль отправки т.к. в более загруженной моделе у меня было несовпадение иногда (очень редко), но оно и тормозило все по идее 
хм неужели никто с таким не сталкивался...
PM MAIL   Вверх
hawk3500
Дата 20.1.2012, 08:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



В MSDN на счёт WSASend с ovreloped пишут:
/*
For overlapped sockets (created using WSASocket with flag WSA_FLAG_OVERLAPPED) sending information uses overlapped I/O, unless both lpOverlapped and lpCompletionRoutine are NULL. In that case, the socket is treated as a nonoverlapped socket. A completion indication will occur, invoking the completion of a routine or setting of an event object, when the buffer(s) have been consumed by the transport. If the operation does not complete immediately, the final completion status is retrieved through the completion routine or WSAGetOverlappedResult.
*/
WSAGetOverlappedResult
А вот эта функция покажет сколько реально отправилось.




--------------------
воин dzen'a
PM MAIL   Вверх
Олег2005
Дата 20.1.2012, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(12usver12 @  19.1.2012,  13:59 Найти цитируемый пост)
Хотя overlapped модель специфическая при wsasend данные копируются сразу во внутренний буфер транспортного провайдера , т.е. как бы гарантируется отправка (или нет ?) 

Ну, во первых модель перекрытия - не для таких вариантов - а для того, что бы на ОДНОМ и ТОМже сокете, не дожидаясь завершения другой операции - одновременно делать сенд и ресив или аналогичные операции передачи/приема.
Данные копируются в буфер отправки TCP-модуля только, если все WSABuff - будут нулевыми.
Цитата(12usver12 @  19.1.2012,  13:59 Найти цитируемый пост)
в обработчике события OnSend вести учет отправленных данных ? 

В целях отладки - да, можно - но не обязательно.
Любая функция отправки реально скопирует свой буфер в буфер модуля TCP - если этот буфер освободился - те. на момент исполнения сенда карточка успела все отослать в сеть.... 
Надо всегда помнить об этом.
Сеть притормоозила - и все.
Чтобы не заморачиваться - можно использовать TransmitFile. 
Как раз для ваших объемов.
Для малых объемов может быть нерационально. Имхо.

Добавлено @ 20:36
Цитата(12usver12 @  19.1.2012,  22:48 Найти цитируемый пост)
просмотрел , много общих понятий по перекрытым сокетам 

А что вы думаете?
Я это писал лет 10 тому назад....на форуме выложил наверно позже.
в 2000 году об этом вообще мало кто знал..... smile 

Это сообщение отредактировал(а) Олег2005 - 20.1.2012, 20:37
PM MAIL WWW MSN   Вверх
12usver12
Дата 22.1.2012, 00:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



скорей всего баг где-то выскакивает
PM MAIL   Вверх
Олег2005
Дата 22.1.2012, 01:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Потому это и есть особенность сетевого программирования - я имею в виду - сетевые функции, а не ошибки в алгоритмах или програмировании.
Любая сетевая функция профессионально должна быть обернута в IF - с последующим анализом - ВСЕХ возможных вариантов ошибок.
Да, утомительно - поэтому Стивенс и пишет о важности написания классов (функций, процедур) - оберток.
PM MAIL WWW MSN   Вверх
12usver12
Дата 23.1.2012, 02:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



где-то в просторах инета отыскал такую мысль
Цитата

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

то есть может быть такая ситуация если я быстро сделаю 5 раз WSASend по 5 байт , то мне может прийти только один OnSend callback где cbTransfered = 25 или я перемудрил  smile  ?

Это сообщение отредактировал(а) 12usver12 - 23.1.2012, 02:20
PM MAIL   Вверх
Dem_max
Дата 23.1.2012, 08:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата

то есть может быть такая ситуация если я быстро сделаю 5 раз WSASend по 5 байт , то мне может прийти только один OnSend callback где cbTransfered = 25 или я перемудрил    ?


Да, а можешь отправить 25, а получить 5 по 5.


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
Олег2005
Дата 23.1.2012, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(12usver12 @  23.1.2012,  01:19 Найти цитируемый пост)
НО никто не гарантирует, какими кусками они будут приходить. Куски данных, запиханные в поток отправителем могут по дороге как побиться мельче чем отправлялись, так и склеиться. 

Не совсем верно.
Поток байтов TCP-не разбивается - сам - по дороге.
Могут только фрагментироваться пакеты IP- по причине разных MTU составной сети.

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


 




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


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

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