|
Виндавс издевается: Ошибка "Connection reset by peer" на UDP сокете
|
|||
---|---|---|---|
#18+
Виндавс7 слишком умный. Получатель на UDP-порту 127.0.0.1:12345. Отправитель открывает случайный порт 127.0.0.1:0 и шлет на получателя. Так все работает. Но если получателя нет, например не успел стартануть, то отправитель получает ошибку на recvfrom() Код: plaintext 1. 2. 3.
WSAGetLastError() показывает 10054 https://docs.microsoft.com/en-us/windows/win32/winsock/windows-sockets-error-codes-2 WSAECONNRESET 10054 Connection reset by peer. An existing connection was forcibly closed by the remote host. This normally results if the peer application on the remote host is suddenly stopped, the host is rebooted, the host or remote network interface is disabled, or the remote host uses a hard close (see setsockopt for more information on the SO_LINGER option on the remote socket). This error may also result if a connection was broken due to keep-alive activity detecting a failure while one or more operations are in progress. Operations that were in progress fail with WSAENETRESET. Subsequent operations fail with WSAECONNRESET. Принцип работы: отправитель открывает порт и запускает отдельный поток для ожидания входящих, в том потоке recvfrom(). Затем происходит отправка нескольких пакетов и recvfrom() прекращает ожидание с ошибкой. Нафига такая фича? Это же UDP, сейчас нет получателя, через секунду появился, а у меня поток приема уже завершился и больше ответов не ожидает. Может кто знает как эту "продвинутость" отключить? Код открытия порта Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59.
PS sendto() никаких ошибок не выдает. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2020, 10:31 |
|
Виндавс издевается: Ошибка "Connection reset by peer" на UDP сокете
|
|||
---|---|---|---|
#18+
Дело, скорее всего, в том, что при получении пакета, которого никто не ждёт, IP-стек отправляет ICMP-ответ "нехрен сюда долбиться" ( Port Unreachable ). Интеллект винды тут ни при делах - это (штатная) ситуация, которую надо (как-то) обрабатывать. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2020, 11:19 |
|
Виндавс издевается: Ошибка "Connection reset by peer" на UDP сокете
|
|||
---|---|---|---|
#18+
Dima T Может кто знает как эту "продвинутость" отключить? Отключать не надо. Просто после такой ошибки еще раз повторить отправку/получение ... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2020, 12:02 |
|
Виндавс издевается: Ошибка "Connection reset by peer" на UDP сокете
|
|||
---|---|---|---|
#18+
Имеет смысл повторять с экспоненциальным таймаутом. Или использовать шаблон cirquit-breaker если таковых потоков будет несколько которые имеют интерес писать в этот UDP-port. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2020, 12:14 |
|
Виндавс издевается: Ошибка "Connection reset by peer" на UDP сокете
|
|||
---|---|---|---|
#18+
mayton Имеет смысл повторять с экспоненциальным таймаутом. Или использовать шаблон cirquit-breaker если таковых потоков будет несколько которые имеют интерес писать в этот UDP-port. А зачем экспоненциальный таймаут? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2020, 12:28 |
|
Виндавс издевается: Ошибка "Connection reset by peer" на UDP сокете
|
|||
---|---|---|---|
#18+
Добавил проверку этой ошибки Код: plaintext 1.
срабатывает ровно столько раз - сколько отправлено UDP-пакетов, т.е. после каждого вызова sendto(). При отправке на другой комп этой ошибки не происходит, т.е. как-то ее обрабатывать нет смысла, только игнорить, чтобы при отладке не мешала. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2020, 12:35 |
|
Виндавс издевается: Ошибка "Connection reset by peer" на UDP сокете
|
|||
---|---|---|---|
#18+
Dima T При отправке на другой комп этой ошибки не происходит ... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2020, 12:37 |
|
Виндавс издевается: Ошибка "Connection reset by peer" на UDP сокете
|
|||
---|---|---|---|
#18+
Basil A. Sidorov Dima T При отправке на другой комп этой ошибки не происходит Нет, комп пингуется, в его расшаренные папки захожу, браэндмауэр в режиме "сеть предприятия". Стандартные настройки. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2020, 12:41 |
|
Виндавс издевается: Ошибка "Connection reset by peer" на UDP сокете
|
|||
---|---|---|---|
#18+
petrav mayton Имеет смысл повторять с экспоненциальным таймаутом. Или использовать шаблон cirquit-breaker если таковых потоков будет несколько которые имеют интерес писать в этот UDP-port. А зачем экспоненциальный таймаут? Я сейчас ищу какой-то ответ. Но все ответы очень банальные. Вобщем. Так принято. Чтоб не перегружать сеть безсмысленными пробами. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2020, 12:44 |
|
Виндавс издевается: Ошибка "Connection reset by peer" на UDP сокете
|
|||
---|---|---|---|
#18+
По умолчанию, штатный виндовый файервол разрешает далеко не все ICMP-коды. "Echo request/reply" (пинг) - да, с остальным будут варианты. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2020, 12:46 |
|
Виндавс издевается: Ошибка "Connection reset by peer" на UDP сокете
|
|||
---|---|---|---|
#18+
mayton Чтоб не перегружать сеть безсмысленными пробами "Перегружать" или не "перегружать" - зависит от действий получателя и реакции отправителя. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2020, 12:50 |
|
Виндавс издевается: Ошибка "Connection reset by peer" на UDP сокете
|
|||
---|---|---|---|
#18+
mayton petrav пропущено... А зачем экспоненциальный таймаут? Я сейчас ищу какой-то ответ. Но все ответы очень банальные. Вобщем. Так принято. Чтоб не перегружать сеть безсмысленными пробами. Это тут лишнее, т.к. управление потоком вынесено на уровень выше, не будет ответов - отправка прекратиться. В данном слое требуется только отправить/принять. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2020, 13:05 |
|
Виндавс издевается: Ошибка "Connection reset by peer" на UDP сокете
|
|||
---|---|---|---|
#18+
Это корнями уходит в теорию управления. Последний раз мы использовали этот алгоритм явно при работе с загрузкой данных в S3Bucket. У него было определённое поведение когда в ответ на IOException (с кодом HTTP-429 или что-то подобное), самое правильное что мы могли сделать это "подождать" с ростом пауз. И с джиттером. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2020, 13:06 |
|
Виндавс издевается: Ошибка "Connection reset by peer" на UDP сокете
|
|||
---|---|---|---|
#18+
Dima T https://docs.microsoft.com/en-us/windows/win32/winsock/windows-sockets-error-codes-2 А теперь открываем доку посвежее: https://docs.microsoft.com/en-us/windows/win32/api/winsock/nf-winsock-recvfrom MSDNWSAECONNRESET The virtual circuit was reset by the remote side executing a hard or abortive close. The application should close the socket; it is no longer usable. On a UDP-datagram socket this error indicates a previous send operation resulted in an ICMP Port Unreachable message. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2020, 13:15 |
|
Виндавс издевается: Ошибка "Connection reset by peer" на UDP сокете
|
|||
---|---|---|---|
#18+
Basil A. Sidorov По умолчанию, штатный виндовый файервол разрешает далеко не все ICMP-коды. "Echo request/reply" (пинг) - да, с остальным будут варианты. Похоже что так оно и есть. Отключил брандмауэры на обоих компах - получил эту ошибку по сети. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2020, 13:58 |
|
Виндавс издевается: Ошибка "Connection reset by peer" на UDP сокете
|
|||
---|---|---|---|
#18+
Отключать наверное не стоило. Просто разрешить ICMP. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.06.2020, 11:59 |
|
|
start [/forum/topic.php?fid=57&msg=39968175&tid=2017410]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
36ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
51ms |
get tp. blocked users: |
1ms |
others: | 287ms |
total: | 418ms |
0 / 0 |