| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Сети > [Boost::asio::ip::udp] не полное чтение дейтаграмм |
| Автор: cupper 1.3.2012, 17:44 | ||||||||
Проверяю как поведет себя система если будет получена дейтаграмма с большими чем ожидалось данными.
Особенность в том что в Win кидается исключение с текстом
ну а в буферое ровно столько сколько я запросил. В Linux исключение не бросается, данных опять ровно столько сколько запросил. Почему исключение не бросается ? Или почему бросается... Вот сама функция из boost 1.44
Добавлено @ 17:54 Продолжу, в windows части юзается функция WSARecvFrom которая судя по всему возвращает ошибку
Под линукс, все сводится к операции функции recvmsg... осталось понять почему не происходит ошибки и что произойдет если попробовать читать дальше. Дочитается часть недочитанной дейтаграммы (и будет у меня epic fail) или же все таки первая дейтаграмма отбросится, и будет ждатся вторая. Как в случае в win. |
| Автор: cupper 1.3.2012, 18:22 | ||
| из описание функций recv int recvfrom int recvmsg
так... уже нащупывается... И все... и где искать описание поведения (( |
| Автор: cupper 1.3.2012, 22:00 | ||||||
Придется. Полистал "Unix Сетевое программирование", книженция блин большая, по оглавлению и главан с этими функциями ничего не нашел, по идее там должно быть это описано. Но что уж точно так это то что нужно юзать версию которая никогда не бросает исключение
|
| Автор: cupper 2.3.2012, 13:16 | ||||
| Вот этот небольшой примерчик демонстрирует что операция неполного чтения дейтаграммы вполне корректна. Повторное чтение недочитанной дейтаграммы как и ожидалось не происходит.
выхлоп
|
| Автор: boostcoder 2.3.2012, 13:25 | ||
гут. плохо то, что нет возможности узнать, не была ли считана вся дейтаграмма. Добавлено через 17 секунд в смысле, в линуксе. Добавлено через 8 минут и 34 секунды хотя есть возможность узнать сколько данных готовы для чтения: http://www.boost.org/doc/libs/1_49_0/doc/html/boost_asio/reference/basic_datagram_socket/available.html |
| Автор: cupper 2.3.2012, 13:46 | ||||||||
Ошибка на самом деле есть. И получит ее можно при вызове
таким образом поменяв в коде получение сообщения на
Мы не получаем ошибку ни в Errno, ни в recvmsg, но в msg.msg_flags она таки фигурирует. Хреного что в бусте это не учтено. |
| Автор: boostcoder 2.3.2012, 14:04 |
напишу автору. |
| Автор: cupper 2.3.2012, 14:07 | ||||||||
это кстати хорошо. Втыкну у себя проверку что если буфер меньше чем доступно то будет исключение кидаться. Так хоть кроссплатформенное поведение будет Правда еще нужно понять а размер чего он возвращает: всей дейтаграммы, пользовательских данных, из одной или их всех дейтаграм... ну и прочее. Там все сводится к ioctl
На что он скорее всего ответит
А еще это может так только в 1.44, Нужно еще на новых проверять. |
| Автор: boostcoder 2.3.2012, 14:12 |
тут на лицо несоответствие поведения на win/lin платформах. а такого в здравом уме никто не допустит. по всей видимости, упустил. Добавлено через 35 секунд может. |
| Автор: cupper 2.3.2012, 14:36 | ||
| avialble не спасет при асинхронных операциях которые я юзаю для реализации "чтение с timeout" :( Можно попробовать уже после операции чтения сравнить реальное полученное (а не возвращенное операцией чтения) число байт в дейтаграмме и сравнить его с размером предоставленного буфера... Хотя я не уверен что из буста я смогу вытащить реальный размер данных дейтаграммы. Вообще да, это явно ошибка потому что функция WSARecvFrom (используема в win части) возвращает не число считанный байт а статус операции
А функция recvmsg (используемая в Linux) возвращает именно число считанных байт А вот общий результат чтения и в первом и во втором случае получается из возвращенных значений. PS. avialble возвращает общее число пользовательских данных в сокете. Если в скокете несколько дейтаграм то сумму со всех. Это капец блин :( PPS. Вы не поверите Я в печальке. Может я чего не так делаю... ну не может быть такой epic fail. |