![]() |
Модераторы: feodorv |
![]() ![]() ![]() |
|
Hellriser |
|
||||
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 4.8.2009 Репутация: нет Всего: нет |
Всем доброго времени суток, помогите разобраться с обработкой событий.
Есть сл. код:
проблема в том, что при первом вызове всё срабатывает, события устанавливаются, а при дальнейших вызовах
P.S. Модераторы, прошу прощения, что тему перепутал. Это сообщение отредактировал(а) Hellriser - 4.8.2009, 13:58 |
||||
|
|||||
dumb |
|
|||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 1 Всего: 158 |
если кратко: неправильно все, от начала и до конца.
по пунктам:
|
|||
|
||||
Hellriser |
|
|||
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 4.8.2009 Репутация: нет Всего: нет |
господа подскажите пожалуйста как правильно организовать прием данных, делаю так
но ответ приходит двумя пакетами, т.о. после чтения первого пакета происходит WSAEWOULDBLOCK на данный момент делаю возврат к ожиданию FD_READ и ставлю таймаут, но при сильной загрузке канала или сервера выход по таймауту может произойти раньше чем вторая часть ответа придет, с другой стороны при большом значении таймаута получается лишние задержки в работе приложения |
|||
|
||||
Олег2005 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 421 Регистрация: 26.5.2005 Где: Рига Латвия Репутация: 6 Всего: 11 |
Поясните, как потоковая передача TCP может базироваться на пакетах?
recv() принимает поток байтов - до прихода FIN с той стороны. Скорее всего у вас неверна логика использования recv() |
|||
|
||||
Hellriser |
|
|||
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 4.8.2009 Репутация: нет Всего: нет |
Сначала сервер присылает ответ что команда принята, а потом уже начинает отправку данных, т.е получается что выбираю строку ответа, что команда принята и на этом как бы буфере все, данных нет, соответственно возникает ошибка нет данных для чтения если делаю возврат к ожиданию события, то все данные принимаются. Так же при пошаговом выполнении, тоже все данные выбираются т.е на сколько я понимаю получается, что просто не успевают данные основные дойти на тот момент когда выбирается из буфера ответ.
Сори что криво изъясняюсь, уже запарился :( |
|||
|
||||
Олег2005 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 421 Регистрация: 26.5.2005 Где: Рига Латвия Репутация: 6 Всего: 11 |
Таким образом, сервер передает вам небольшую порцию - свой ответ. Соединение он не закрывает, а вы считываете из буфера TCP все что пришло. Событие FD_READ (что-то есть для чтения в буфере TCP)сбрасывается, так как буфер приема пуст. То, что последующий запуск recv() возвращает WSAEWOULDBLOCK, это верно - сокет то у вас асинхронный, а вот сервер еще не успел по сети прислать вторую порцию данных, и FD_READ еще не возникло. Наверно так? Тут ничего не поделаешь - увы, это сеть. Конечно же вы не знаете, когда придет следующая порция. Тут наверно надо правильно обработать первый WSAEWOULDBLOCK - и после получения его вернуться на if((SockProcessEv.lNetworkEvents & FD_READ) && (SockProcessEv.iErrorCode[FD_READ_BIT] == 0)) Иначе точный тайм-аут не выставить, поэтому придется грузить процессор и выполнять этот IF в цикле - столько раз, сколько надо. Это такая мысль на ходу.... Если ваши правила обмена с сервером (протокол общения) это позволяют, то можно попробовать нечто в таком духе. Для уменьшения нагрузки при переключении контекстов можно такое чтение делать в отдельном потоке..... Это сообщение отредактировал(а) Олег2005 - 16.8.2009, 20:20 |
|||
|
||||
![]() ![]() ![]() |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Сети | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |