Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Сети > recvfrom(UDP) и MSG_WAITALL.Вопрос.


Автор: nic1986 12.12.2015, 00:57
Если размер датаграммы меньше длины приемного буфера, то recvfrom её считает в буфер,если он был вызван с флагом MSG_WAITALL ? Или он тупо будет ждать пока буфер сокета заполниться до нужного обьема?
например:
1.выставить размер буфера сокета 64к
2.вызвать recvfrom с MSG_WAITALL,с len буфера тоже 64к
3.приходит датаграмма 16к
recvfrom будет ждать пока придет еще 3 по 16к , или он считает те 16к и завершиться?
    

Автор: feodorv 12.12.2015, 12:31
Цитата(nic1986 @  12.12.2015,  00:57 Найти цитируемый пост)
MSG_WAITALL

Просто сходу:
Цитата
MSG_WAITALL - This flag is not supported on datagram sockets or message-oriented sockets.
А чего, собственно, Вы хотите добиться? 

Максимальный размер датаграммы естественным образом ограничен:
Цитата
Поле, задающее длину всей датаграммы (заголовка и данных) в байтах. Минимальная длина равна длине заголовка — 8 байт. Теоретически, максимальный размер поля — 65535 байт для UDP-датаграммы (8 байт на заголовок и 65527 на данные). Фактический предел для длины данных при использовании IPv4 — 65507 (помимо 8 байт на UDP-заголовок требуется ещё 20 на IP-заголовок).
Поэтому отослать более 64K в датаграмме у Вас не получится.

Более того, датаграмма принимается и передаётся пользователю исключительно целиком. Если recvfrom отработал без ошибок и принял 16K (при большем заданном размере пользовательского буфера), то это значит, что датаграмма именно такого размера и была послана. Две датаграммы за один вызов recvfrom получить нельзя.

Автор: nic1986 12.12.2015, 23:20
Цитата(feodorv @  12.12.2015,  12:31 Найти цитируемый пост)
Более того, датаграмма принимается и передаётся пользователю исключительно целиком. Если recvfrom отработал без ошибок и принял 16K (при большем заданном размере пользовательского буфера), то это значит, что датаграмма именно такого размера и была послана. Две датаграммы за один вызов recvfrom получить нельзя. 

Спасибо, это и хотел узнать. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)