Я пытался использовать сокеты UDP. На клиенте я устанавливаю определенный тайм-аут, и когда я вызываю recv(), я проверяю возвращаемое значение, и если оно меньше 0, я проверяю, является ли errno EAGAIN или EWOULDBLOCK. Если errno не является одним из этих 2, я пытаюсь восстановить соединение с сервером. Теперь мне нужно определить, закрыт ли другой конец соединения или нет. Кроме того, проверяя, что возвращаемое значение recv() равно «0», нужно ли проверять errno? Does recv() устанавливает errno, если другой конец сокета закрыт? Если нет, то почему errno не задан?Почему recv() не устанавливает errno, если закрыт другой конец сокета?
ответ
UDP не имеет соединений, и поэтому вы не можете легко определить, закрыл ли другой конец разъема. Если вам нужны соединения, вы должны использовать TCP.
Однако часто принимает приемник отправляет ICMP-ответ при обращении к порту UDP, который не открыт; это может быть указано как возвращаемое значение от recv
или send
; в Linux это может случиться для любых сокетов UDP, а для BSD, похоже, это относится только к «подключенным» UDP-сокетам.
В любом случае, вы не можете вывести между любыми из
- ICMP по отношению к отправителю фильтруется с помощью брандмауэра
- UDP в сторону приемника фильтруется с помощью брандмауэра
- UDP успешно доставлены в приемник
Таким образом, я бы рассматривал возможную сигнализацию ошибок UDP как «приятное дополнение», но не на что полагаться.
TCP очень похож на телефонный звонок, тогда как UDP больше похож на почтовые ящики. Если вы отправите письмо на несуществующий адрес, у которого нет почтового ящика, вы можете отправить через 2 недели с письмом, в котором говорится, что почта не может быть доставлена.
Если вы не получили письмо, то получатель получил его, почтовый человек украл его, он был измельчен на сортировочной машине или, возможно, собака съела письмо; единственный способ узнать, что он был фактически получен, будет заключаться в том, что получатель отправил другое письмо, подтверждающее получение.
Спасибо Антти. В нашем проекте мы используем UDP, а на клиенте я использую вызов recv() с таймаутом. В каком-то угловом случае сервер умер, и в наших системах есть агент мониторинга, который будет отслеживать процесс, и если какой-либо процесс замирает, он перезапустит процесс. Поскольку я проверяю только, если возвращаемое значение os recv() меньше 0, я слушаю старый сокет, и хотя сервер запускается заново, я не могу получить сообщения. Можете ли вы предложить любую идею, как исправить. – kadina
@ kadina: Это звучит очень странно. Поскольку UDP не является соединением, прослушивающий UDP-сокет должен забрать все, что отправлено на его IP-адрес и порт. Вы уверены, что другая сторона не просто забыла отправить вам? –
@kadina: например, демон syslog, прослушивающий сообщения syslog UDP, не нуждается в повторном открытии своего сокета. Он просто продолжает получать сообщения. –
- 1. Розетка не регистрируется, когда другой конец закрыт.
- 2. Функция сокета программирование-recv()
- 3. stop recv из сокета, если данных нет
- 4. SEGFAULT после recv из сокета
- 5. recv() конец строки
- 6. Является ли ошибка сокета об ошибке сокет закрыт
- 7. Почему пауза возвращает -1 и устанавливает errno?
- 8. Как проверить, принят ли другой конец сокета?
- 9. Не recv() в программировании блокировки сокета C?
- 10. Почему считываемый конец трубы считывает EOF только в том случае, если конец записи закрыт?
- 11. recv() с errno = 107: (связанная с конечной точкой передачи)
- 12. Запустите Cronjob, если другой конец?
- 13. Strtol не устанавливает errno при преобразовании переполнения
- 14. python - как форматировать вывод сокета recv()?
- 15. readlink устанавливает errno в ENOENT
- 16. Функция supress recv() в программировании сокета python
- 17. Сокет закрыт до recv без вызова close
- 18. Определите, закрыт ли другой конец (внезапно) соединение tcp
- 19. Блокировка recv не выходит при закрытии сокета из другого потока?
- 20. Errno ошибка сокета в питона
- 21. установка таймаута для сокета recv TCP
- 22. Программирование сокетов C: вызов recv() изменяет дескриптор файла сокета?
- 23. Функция сокета TCP recv() программа блокировки
- 24. Почему socket.isOutputShutdown() возвращает false, даже если сокет закрыт?
- 25. python recv из закрытого блокирующего сокета
- 26. Как проверить, закрыт ли выходной поток сокета?
- 27. Отдельные темы для сокета send/recv?
- 28. IOError: [Ошибка сокета Errno] [Errno 11004] getaddrinfo failed
- 29. как обнаружить конец сокета InputStream?
- 30. recv() ошибка программирования сокета C/C++
Вопрос о «другом конце» сокета UDP напоминает запрос «другого конца» почтового ящика ... пакеты, протекающие через сокет UDP, могут поступать из (или переходить) к множеству разных адресатов. –
Если вы хотите «подключения», то вам нужен TCP или, возможно, SCTP. –