Прежде всего, пожалуйста, посмотрите этот вопрос чтобы понять, о чем я говорил.
Когда я пытаюсь закрыть сокет в ОС Windows для недоступного IP-адреса с помощью UDP, я получил трехсекундную задержку.
Как видно из результатов, в ОС Windows задержка составляет три секунды. Но в Ubuntu нет задержки, а именно проблема связана с операционной системой Windows. Как уменьшить трехсекундную задержку до нуля?
Время закрытия сокета Windows для недоступного IP (с UDP): 3 секунды
Время закрытия сокета Ubuntu для недоступного IP (с UDP): 0 секунд
Заранее спасибо...
Вот глупый пример из .СЕТЬ docs, который принимает протокол без установления соединения и использует connect (), чтобы он мог блокироваться как сумасшедший, и почти наверняка подождет несколько секунд в конце, пока шальной ICMP недоступен для может быть прибыть:
https://docs.microsoft.com/en-us/dotnet/api/system.net.sockets.udpclient?view=netframework-4.7
это ваш ответ о том, что делать в Windows, чтобы быстро выйти из этого UDP-сокета:
(ИМХО если это уважаемый то, что UDP пытался выполнить, он будет использовать асинхронную отправку / получение, установите Linger в false
, и для хорошей меры установите таймауты отправки и получения на небольшие миллисекунды, даже если они не должны иметь значения ... а затем просто завершите, не очищая себя ...)
Серьезно, вот MSDN уточняя, как это работает:
https://stackoverflow.com/questions/4160347/close-vs-shutdown-socket?rq=1
В этом посте подчеркивается важность установки дескриптора на неблокирование (SOCK_STREAM по умолчанию блокирует в Windows).
https://stackoverflow.com/questions/17058224/concept-of-non-blocking-socket-functions-using-wsawaitformultipleevents?rq=1
Вот более портативный способ сделать это (вместо работы с окнами setsocketopt() or similar
- poll()
или select()
перед выключением)
https://stackoverflow.com/questions/16163260/setting-timeout-for-recv-fcn-of-a-udp-socket?rq=1
Вот питон напоминая нам, что если вы отправляете его UDP, вам не обязательно ожидать чего-либо в ответ. А также объясняя ошибку:
https://stackoverflow.com/questions/34242622/windows-udp-sockets-recvfrom-fails-with-error-10054?rq=1
Ты настоящий не вам нужно закрыть свои UDP-сокеты, если вы все равно уходите. Будь негодяем.
https://stackoverflow.com/questions/19819927/when-to-close-a-udp-socket?rq=1
По крайней мере, setsocketopt () ПОВТОРНОЕ ИСПОЛЬЗОВАНИЕ, если вы захотите это позже (скажем, в цикле).
Close vs. Shutdown (в основном TCP), если вы все еще не уверены:
https://stackoverflow.com/questions/4160347/close-vs-shutdown-socket?rq=1
И вот несколько причин, по которым вы должны убирать за собой:
https://stackoverflow.com/questions/12776563/what-is-the-drawback-if-i-do-not-invoke-the-udpclient-close-method