2012-04-10 4 views
0

У меня есть клиентское приложение, использующее метод winsock sendto() для отправки данных на серверное приложение с UDP. На моем клиентском приложении я делаю, скажем, 5 быстро sendto(). На моем серверном приложении я жду, скажем, 10 секунд, а затем сделаю select() и recvfrom(). Будет ли recvfrom() передать мне первый пакет, посланный клиентом, или он будет произвольным (какой бы ни был первым)? Смогу ли я получить еще 4 пакета данных или UDP-инфраструктура winsock только буфер?C++ winsock recvfrom() и sendto()

ответ

1

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

Для второй части: как правило, операционная система будет буферизовать определенное количество пакетов для вас, это зависит от буфера сокета, настроенного для сокетов UDP - буфер специфичен для каждого сокета и не используется совместно с ними. В Windows я не уверен, как получить размер буфера, в Linux, проверьте «/ proc/sys/net/ipv4/udp_mem»; Как правило, вы легко сможете разместить пять UDP-пакетов.

+0

Может ли 'recvfrom()' возвращать один и тот же пакет дважды, даже если он был отправлен только один раз? –

+1

Да, дублирование пакетов может произойти в пути. В UDP все ставки отключены. надежность. – modelnine

2

Будет recvfrom() дать мне первый пакет, отправленный клиентом или будет произвольный один

Поскольку UDP не обрабатывает переназначения, вы можете получить любой из сообщений. Вы можете получить менее 4 сообщений или даже больше (но это редкость сегодня).

1

С 5 пакетами разумного размера, то вы, вероятно, получить все пакеты, и вы, вероятно, получить первый посланный первым. Но они могут быть не в порядке, могут не прибыть и могут не содержать исходные данные, если они действительно прибудут. Вы должны обрабатывать все это с помощью UDP. (Но в зависимости от вашего приложения и требований и стабильности вашей сети это может не быть реальной проблемой, и, конечно же, возможно, что некоторые ситуации будут существовать там, где получение 99% данных совершенно нормально).

+0

Хотя очень вероятно, что, по крайней мере, данные будут верными, поскольку UDP имеет встроенный встроенный контрольный набор. –

+0

Если на исходном хосте включена проверка контрольных сумм UDP - хосты могут не использовать проверочную проверку UDP на стороне отправки. – modelnine

Смежные вопросы