![]() |
|
Модераторы: feodorv |
![]()
|
|
| 12usver12 |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 247 Регистрация: 5.1.2007 Репутация: нет Всего: 1 |
Использую в своей программе overlapped модель с callback/completion routines - с калбэками вообщем, особенность в том что в функциях WSARecv/WSASend в
последнем параметре указываются калбэки на события отправки/получении данных, соответственно эти операции заканчиваются моментально с успехом или ошибкой wsa_io_pending (в процессе выполнения). Интересует нужно ли при WSASend напр
в обработчике события OnSend вести учет отправленных данных ? аля
? Хотя overlapped модель специфическая при wsasend данные копируются сразу во внутренний буфер транспортного провайдера , т.е. как бы гарантируется отправка (или нет ?) и после окончания полной отправки выкинет на OnSend. Проводил эксперимент на локальной машине отправку 100 мб файла - все так и было, в OnSend показало что отправилось все 100 |
||||
|
|||||
| hawk3500 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 246 Регистрация: 6.2.2009 Репутация: нет Всего: 2 |
Надо учитывать , но по другому.
Вот линк: http://forum.sources.ru/index.php?showtopic=170146 Там Олег2005 приводит доку в которой есть пример интересующего Вас вопроса. --------------------
воин dzen'a |
|||
|
||||
| 12usver12 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 247 Регистрация: 5.1.2007 Репутация: нет Всего: 1 |
просмотрел , много общих понятий по перекрытым сокетам , но конкретно по моему вопросу нет к сожалению... но сдается мне что все-таки нужен контроль отправки т.к. в более загруженной моделе у меня было несовпадение иногда (очень редко), но оно и тормозило все по идее
хм неужели никто с таким не сталкивался... |
|||
|
||||
| hawk3500 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 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 |
|||
|
||||
| Олег2005 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 421 Регистрация: 26.5.2005 Где: Рига Латвия Репутация: 6 Всего: 11 |
Ну, во первых модель перекрытия - не для таких вариантов - а для того, что бы на ОДНОМ и ТОМже сокете, не дожидаясь завершения другой операции - одновременно делать сенд и ресив или аналогичные операции передачи/приема. Данные копируются в буфер отправки TCP-модуля только, если все WSABuff - будут нулевыми. В целях отладки - да, можно - но не обязательно. Любая функция отправки реально скопирует свой буфер в буфер модуля TCP - если этот буфер освободился - те. на момент исполнения сенда карточка успела все отослать в сеть.... Надо всегда помнить об этом. Сеть притормоозила - и все. Чтобы не заморачиваться - можно использовать TransmitFile. Как раз для ваших объемов. Для малых объемов может быть нерационально. Имхо. Добавлено @ 20:36 А что вы думаете? Я это писал лет 10 тому назад....на форуме выложил наверно позже. в 2000 году об этом вообще мало кто знал..... Это сообщение отредактировал(а) Олег2005 - 20.1.2012, 20:37 |
|||
|
||||
| 12usver12 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 247 Регистрация: 5.1.2007 Репутация: нет Всего: 1 |
скорей всего баг где-то выскакивает
|
|||
|
||||
| Олег2005 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 421 Регистрация: 26.5.2005 Где: Рига Латвия Репутация: 6 Всего: 11 |
Потому это и есть особенность сетевого программирования - я имею в виду - сетевые функции, а не ошибки в алгоритмах или програмировании.
Любая сетевая функция профессионально должна быть обернута в IF - с последующим анализом - ВСЕХ возможных вариантов ошибок. Да, утомительно - поэтому Стивенс и пишет о важности написания классов (функций, процедур) - оберток. |
|||
|
||||
| 12usver12 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 247 Регистрация: 5.1.2007 Репутация: нет Всего: 1 |
где-то в просторах инета отыскал такую мысль
то есть может быть такая ситуация если я быстро сделаю 5 раз WSASend по 5 байт , то мне может прийти только один OnSend callback где cbTransfered = 25 или я перемудрил Это сообщение отредактировал(а) 12usver12 - 23.1.2012, 02:20 |
|||
|
||||
| Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: нет Всего: 39 |
Да, а можешь отправить 25, а получить 5 по 5. -------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
| Олег2005 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 421 Регистрация: 26.5.2005 Где: Рига Латвия Репутация: 6 Всего: 11 |
Не совсем верно. Поток байтов TCP-не разбивается - сам - по дороге. Могут только фрагментироваться пакеты IP- по причине разных MTU составной сети. Ну а склеиваться по дороге - вообще не могут. НИКАК. Собирает поток только модуль получателя. |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Сети | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |