У меня есть клиентское приложение, использующее метод winsock sendto()
для отправки данных на серверное приложение с UDP. На моем клиентском приложении я делаю, скажем, 5 быстро sendto()
. На моем серверном приложении я жду, скажем, 10 секунд, а затем сделаю select()
и recvfrom()
. Будет ли recvfrom()
передать мне первый пакет, посланный клиентом, или он будет произвольным (какой бы ни был первым)? Смогу ли я получить еще 4 пакета данных или UDP-инфраструктура winsock только буфер?C++ winsock recvfrom() и sendto()
ответ
UDP не дает никакой гарантии на полученном упорядочивание пакетов, поэтому в основном, первый пакет вы recvfrom()
может быть первым пакетом вы послали, но не должен быть - это то, что TCP для (что гарантирует упорядоченность полученных данных). Вы, возможно, не получите часть пакетов (или вообще, если на то пошло), если они были потеряны в пути.
Для второй части: как правило, операционная система будет буферизовать определенное количество пакетов для вас, это зависит от буфера сокета, настроенного для сокетов UDP - буфер специфичен для каждого сокета и не используется совместно с ними. В Windows я не уверен, как получить размер буфера, в Linux, проверьте «/ proc/sys/net/ipv4/udp_mem»; Как правило, вы легко сможете разместить пять UDP-пакетов.
Будет recvfrom() дать мне первый пакет, отправленный клиентом или будет произвольный один
Поскольку UDP не обрабатывает переназначения, вы можете получить любой из сообщений. Вы можете получить менее 4 сообщений или даже больше (но это редкость сегодня).
С 5 пакетами разумного размера, то вы, вероятно, получить все пакеты, и вы, вероятно, получить первый посланный первым. Но они могут быть не в порядке, могут не прибыть и могут не содержать исходные данные, если они действительно прибудут. Вы должны обрабатывать все это с помощью UDP. (Но в зависимости от вашего приложения и требований и стабильности вашей сети это может не быть реальной проблемой, и, конечно же, возможно, что некоторые ситуации будут существовать там, где получение 99% данных совершенно нормально).
Хотя очень вероятно, что, по крайней мере, данные будут верными, поскольку UDP имеет встроенный встроенный контрольный набор. –
Если на исходном хосте включена проверка контрольных сумм UDP - хосты могут не использовать проверочную проверку UDP на стороне отправки. – modelnine
- 1. sendto и recvfrom в той же программе?
- 2. Отправка структуры с помощью recvfrom() и sendto()
- 3. SendTo() + recvfrom() буфер путаницы Datagram
- 4. UDP sendto() и recvfrom() Максимальный размер буфера
- 5. Использование sendto() и recvfrom() для доставки дейтаграммы
- 6. Различные характеристики между sendto и recvfrom
- 7. Розетки: sendto() и recvfrom() не работает
- 8. Являются ли функции C recvfrom и sendto взаимоисключающими?
- 9. Установить таймаут для winsock recvfrom
- 10. C++ WINSOCK recvfrom no получить данные из сети
- 11. Можно ли отправить sendto() recvfrom() одновременно?
- 12. Почему sendto стоит гораздо больше, чем recvfrom
- 13. Linux сообщение. Sendto() udp, только recvfrom() raw
- 14. C/C++ Winsock UDP - sendto() на клиенте вызывает утечку памяти
- 15. Путаница о значениях UDP/IP и sendto/recvfrom
- 16. C++ recvfrom timeout
- 17. UDP winsock server C++
- 18. Сокеты UDP: Использование Sender Info из Recvfrom() в Sendto() Fails
- 19. Сокеты UDP: recvfrom и получить адрес
- 20. c- ошибка recvfrom 22
- 21. C recvfrom break syslog
- 22. C `sendto` versus` write`
- 23. Bluetooth с C++ и winsock
- 24. flash.net.Socket и C++ winsock WSAECONNRESET
- 25. recvfrom с ошибкой 11
- 26. C++ - Detours WinSock Hooking
- 27. C windows sendto()
- 28. SendTo: Недопустимый аргумент
- 29. recvfrom содержит лишние байты
- 30. recvfrom зависает на определенных адресах C
Может ли 'recvfrom()' возвращать один и тот же пакет дважды, даже если он был отправлен только один раз? –
Да, дублирование пакетов может произойти в пути. В UDP все ставки отключены. надежность. – modelnine