Путаница в recvfrom () при разработке протокола уровня приложения - PullRequest
2 голосов
/ 28 января 2010

Предположим, Linux и UDP используются.

Страница из recvfrom говорит:

Прием звонков обычно возвращает все доступные данные вплоть до запрошенной суммы, вместо ожидания получения всей запрошенной суммы.

Если это так, то весьма вероятно, что можно вернуть частичные данные протокола прикладного уровня из сокета, даже если задано MAX_SIZE.

Должен ли быть сделан последующий вызов recvfrom?

В другом смысле также возможно иметь больше, чем мне нужно, например два UDP-пакета в буфере сокета. Если в этом случае вызывается recvfrom(), вернет ли он их обоих (предположим, в MAX_SIZE)?

Я полагаю, что в начале каждой UDP-сообщения UDP должна быть информация о размере уровня протокола приложения, чтобы он не испортился.

Ответы [ 2 ]

1 голос
/ 28 января 2010

Ну что ж ... После поиска в Интернете я получил лучший ответ:

Не бойтесь использовать большой буфер и указывать большой размер датаграммы при чтении ... recv() будет читать только ОДНУ дейтаграмму , даже если их много в приемный буфер , и все они помещаются в ваш буфер ... помните, что UDP ориентирован на дейтаграмму , все операции выполняются с этими пакетами, а не с байтами ...

Если бы вы использовали TCP-сокеты, то столкнулись бы с другим сценарием .... TCP не имеет граничной "концепции" , поэтому вы просто читаете столько байтов, сколько хотите, и recv() вернуть количество байтов, равное MIN(bytes_in_buffer, bytes_solicited_by_your_call)

REF: http://www.developerweb.net/forum/archive/index.php/t-3396.html

1 голос
/ 28 января 2010

Я думаю, что вам нужна справочная страница эта . В нем говорится, что дополнительные данные будут отброшены. Если есть два пакета, вызов recvfrom извлечет данные только из первого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...