![]() |
Модераторы: xvr |
![]() ![]() ![]() |
|
mephistotel77 |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 12.4.2010 Репутация: нет Всего: нет |
У меня возник такой вопрос:
Я отсылаю команду серверу (железке), в ответ (как я понял это шесть байт, 4*байт + 1*int16_t) она присылает мне свое состояние в соответствии с протоколом). Но нужно точно знать, что я правильно понял спецификацию и что протокол не изменен. Т.е. что мне передаются именно 6 байт и я именно их и считываю.
Интересуют подходы к тому как можно считать эти самые 6 байт, при этом чтобы гарантированно знать что ещё каких-то данных в сокете не осталось: 1. Попытаться считать количество байт данных, максимальное для протокола UDP и recvfrom возратит количество реальные данных.
2. Я считываю ровно 6 байт и потом смотрю, а остались ли в сокете ещё какие-то данные?
либо вариации на эту тему (кстати более оптимальный/правильный/кошерный код приветствуется). Можно ли сделать как во втором случае? Стивенс пишет по этому поводу (Unix. Разработка сетевых приложений, 3 издание, стр. 278) "Для сокета на уровне UDP происходит неявная буферизация дейтаграмм в виде очереди. Действительно у каждого сокета UDP имеется буфер приема, и каждая дейтаграмма, приходящая на этот сокет, помещается в его буфер приема. Когда процесс вызывает функцию recvfrom, очередная дейтаграмма из буфера возвращается процессу в порядке FIFO..." Т.е. если я считал 6 байт из 10 байт дейтаграммы и вызвал опять recvfrom, то я считаю оставшиеся 4 байта или получу данные с другой дейтаграммы? |
||||||
|
|||||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
нет будет установлен MSG_TRUNC и 4 байта будут потеряны в вашем случае нужно считывать PMTU - 20 - 8 байт (максимальный размер UDP сообщения) по сути первый случай -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
sigizmynd |
|
|||
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 13.8.2010 Репутация: нет Всего: нет |
короче,смотри,
в функцие recvfrom есть поле флаги он имеет 3 различных флага я думаю, что в данном случае для тебя будет интересен флаг MSG_WAITALL привожу описание из книги Рочкинда "программирование для Unix" MSG_WAITALL используется только для сокетов с установленным соединением. блокирует recvfrom до тех пор пока не будет получено запрошенное число байт, флаг MSG_PEEK сброшен вызов не был прерван сигналом.... единственный минус этого флага, что он работает только с TCP((( |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С/С++: Программирование под Unix/Linux" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |