Open raggi opened 4 months ago
Related Issues and Documentation
(Emoji vote if this was helpful or unhelpful; more detailed feedback welcome in this discussion.)
cc @golang/windows
Change https://go.dev/cl/601038 mentions this issue: windows: add SIO_UDP_NETRESET for net/ to use
Change https://go.dev/cl/601397 mentions this issue: internal/poll: disable SIO_UDP_NETRESET on Windows
The Godot project ran into this issue as well, and describes the issue and fix here: godotengine/godot@397b01d
Is there some official documentation for this?
I searched for SIO_UDP_NETRESET, but I could not find anything.
Or are we supposed to assume that https://github.com/godotengine/godot know how it works.
Thank you.
Alex
Change https://go.dev/cl/609295 mentions this issue: windows: add SIO_UDP_NETRESET constant
Go version
go1.22.5
Output of
go env
in your module/workspace:What did you do?
We have observed errors in RecvFrom as a result of ICMP replies to UDP sockets on Windows, which is an unexpected behavior resulting from a Windows socket behavior quirk.
What did you see happen?
Socket recv generated an error as a result of ICMP replies to earlier sent packets.
What did you expect to see?
Socket recv should not generate an error due to ICMP received.
Detail & Proposal
Background: a prior round of this issue was fixed in https://github.com/golang/go/commit/3114bd6f97492461d2027a49fee9f7fce3742b75 which addressed one case of ICMP reply (https://www.betaarchive.com/wiki/index.php?title=Microsoft_KB_Archive/263823), but there are two. The Godot project ran into this issue as well, and describes the issue and fix here: https://github.com/godotengine/godot/commit/397b01d590e5850762d25eaaa2951b1a76da46dc
The net package only disables
SIO_UDP_CONNRESET
, but notSIO_UDP_NETRESET
, as such there are still ICMP responses that can lead towsarecvfrom: The connection has been broken due to keep-alive activity detecting a failure while the operation was in progress.
We should set SIO_UDP_NETRESET as well as SIO_UDP_CONNRESET in order to get behavior that is most similar to bsd sockets on the other major platforms, where asynchronous ICMP replies are ignored unless explicitly opted in to.