![]() |
Модераторы: feodorv |
![]() ![]() ![]() |
|
cupper |
|
||||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 525 Регистрация: 29.11.2006 Репутация: нет Всего: 1 |
Проверяю как поведет себя система если будет получена дейтаграмма с большими чем ожидалось данными.
Особенность в том что в Win кидается исключение с текстом
ну а в буферое ровно столько сколько я запросил. В Linux исключение не бросается, данных опять ровно столько сколько запросил. Почему исключение не бросается ? Или почему бросается... Вот сама функция из boost 1.44
Добавлено @ 17:54 Продолжу, в windows части юзается функция WSARecvFrom которая судя по всему возвращает ошибку
Под линукс, все сводится к операции функции recvmsg... осталось понять почему не происходит ошибки и что произойдет если попробовать читать дальше. Дочитается часть недочитанной дейтаграммы (и будет у меня epic fail) или же все таки первая дейтаграмма отбросится, и будет ждатся вторая. Как в случае в win. Это сообщение отредактировал(а) cupper - 1.3.2012, 17:58 |
||||||||
|
|||||||||
cupper |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 525 Регистрация: 29.11.2006 Репутация: нет Всего: 1 |
из описание функций
recv int recvfrom int recvmsg
так... уже нащупывается... И все... и где искать описание поведения (( Это сообщение отредактировал(а) cupper - 1.3.2012, 18:31 |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 13 Всего: 110 |
походу, так реализовали в asio... я не нашел никакой информации о том, что ошибка вообще будет установлена. проверь. |
|||
|
||||
cupper |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 525 Регистрация: 29.11.2006 Репутация: нет Всего: 1 |
Придется. Полистал "Unix Сетевое программирование", книженция блин большая, по оглавлению и главан с этими функциями ничего не нашел, по идее там должно быть это описано. Но что уж точно так это то что нужно юзать версию которая никогда не бросает исключение
|
|||
|
||||
cupper |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 525 Регистрация: 29.11.2006 Репутация: нет Всего: 1 |
Вот этот небольшой примерчик демонстрирует что операция неполного чтения дейтаграммы вполне корректна.
Повторное чтение недочитанной дейтаграммы как и ожидалось не происходит.
выхлоп
Это сообщение отредактировал(а) cupper - 2.3.2012, 13:20 |
||||
|
|||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 13 Всего: 110 |
гут. плохо то, что нет возможности узнать, не была ли считана вся дейтаграмма. Добавлено через 17 секунд в смысле, в линуксе. Добавлено через 8 минут и 34 секунды хотя есть возможность узнать сколько данных готовы для чтения: http://www.boost.org/doc/libs/1_49_0/doc/h.../available.html |
|||
|
||||
cupper |
|
||||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 525 Регистрация: 29.11.2006 Репутация: нет Всего: 1 |
Ошибка на самом деле есть. И получит ее можно при вызове
таким образом поменяв в коде получение сообщения на
Мы не получаем ошибку ни в Errno, ни в recvmsg, но в msg.msg_flags она таки фигурирует. Хреного что в бусте это не учтено. |
||||||||
|
|||||||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 13 Всего: 110 |
||||
|
||||
cupper |
|
||||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 525 Регистрация: 29.11.2006 Репутация: нет Всего: 1 |
это кстати хорошо. Втыкну у себя проверку что если буфер меньше чем доступно то будет исключение кидаться. Так хоть кроссплатформенное поведение будет ![]() Правда еще нужно понять а размер чего он возвращает: всей дейтаграммы, пользовательских данных, из одной или их всех дейтаграм... ну и прочее. Там все сводится к ioctl
На что он скорее всего ответит
![]() А еще это может так только в 1.44, Нужно еще на новых проверять. Это сообщение отредактировал(а) cupper - 2.3.2012, 14:11 |
||||||||
|
|||||||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 13 Всего: 110 |
тут на лицо несоответствие поведения на win/lin платформах. а такого в здравом уме никто не допустит. по всей видимости, упустил. Добавлено через 35 секунд может. |
|||
|
||||
cupper |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 525 Регистрация: 29.11.2006 Репутация: нет Всего: 1 |
avialble не спасет при асинхронных операциях которые я юзаю для реализации "чтение с timeout" :(
Можно попробовать уже после операции чтения сравнить реальное полученное (а не возвращенное операцией чтения) число байт в дейтаграмме и сравнить его с размером предоставленного буфера... Хотя я не уверен что из буста я смогу вытащить реальный размер данных дейтаграммы. Вообще да, это явно ошибка потому что функция WSARecvFrom (используема в win части) возвращает не число считанный байт а статус операции
А функция recvmsg (используемая в Linux) возвращает именно число считанных байт А вот общий результат чтения и в первом и во втором случае получается из возвращенных значений. PS. avialble возвращает общее число пользовательских данных в сокете. Если в скокете несколько дейтаграм то сумму со всех. Это капец блин :( PPS. Вы не поверите ![]() ![]() Я в печальке. Может я чего не так делаю... ну не может быть такой epic fail. Это сообщение отредактировал(а) cupper - 2.3.2012, 16:31 |
|||
|
||||
![]() ![]() ![]() |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Сети | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |