|
@@ -92,6 +92,25 @@ func (u *RIOConn) bind(sa windows.Sockaddr) error {
|
|
// Enable v4 for this socket
|
|
// Enable v4 for this socket
|
|
syscall.SetsockoptInt(syscall.Handle(u.sock), syscall.IPPROTO_IPV6, syscall.IPV6_V6ONLY, 0)
|
|
syscall.SetsockoptInt(syscall.Handle(u.sock), syscall.IPPROTO_IPV6, syscall.IPV6_V6ONLY, 0)
|
|
|
|
|
|
|
|
+ // Disable reporting of PORT_UNREACHABLE and NET_UNREACHABLE errors from the UDP socket receive call.
|
|
|
|
+ // These errors are returned on Windows during UDP receives based on the receipt of ICMP packets. Disable
|
|
|
|
+ // the UDP receive error returns with these ioctl calls.
|
|
|
|
+ ret := uint32(0)
|
|
|
|
+ flag := uint32(0)
|
|
|
|
+ size := uint32(unsafe.Sizeof(flag))
|
|
|
|
+ err = syscall.WSAIoctl(syscall.Handle(u.sock), syscall.SIO_UDP_CONNRESET, (*byte)(unsafe.Pointer(&flag)), size, nil, 0, &ret, nil, 0)
|
|
|
|
+ if err != nil {
|
|
|
|
+ return err
|
|
|
|
+ }
|
|
|
|
+ ret = 0
|
|
|
|
+ flag = 0
|
|
|
|
+ size = uint32(unsafe.Sizeof(flag))
|
|
|
|
+ SIO_UDP_NETRESET := uint32(syscall.IOC_IN | syscall.IOC_VENDOR | 15)
|
|
|
|
+ err = syscall.WSAIoctl(syscall.Handle(u.sock), SIO_UDP_NETRESET, (*byte)(unsafe.Pointer(&flag)), size, nil, 0, &ret, nil, 0)
|
|
|
|
+ if err != nil {
|
|
|
|
+ return err
|
|
|
|
+ }
|
|
|
|
+
|
|
err = u.rx.Open()
|
|
err = u.rx.Open()
|
|
if err != nil {
|
|
if err != nil {
|
|
return err
|
|
return err
|
|
@@ -122,8 +141,12 @@ func (u *RIOConn) ListenOut(r EncReader) {
|
|
// Just read one packet at a time
|
|
// Just read one packet at a time
|
|
n, rua, err := u.receive(buffer)
|
|
n, rua, err := u.receive(buffer)
|
|
if err != nil {
|
|
if err != nil {
|
|
- u.l.WithError(err).Debug("udp socket is closed, exiting read loop")
|
|
|
|
- return
|
|
|
|
|
|
+ if errors.Is(err, net.ErrClosed) {
|
|
|
|
+ u.l.WithError(err).Debug("udp socket is closed, exiting read loop")
|
|
|
|
+ return
|
|
|
|
+ }
|
|
|
|
+ u.l.WithError(err).Error("unexpected udp socket receive error")
|
|
|
|
+ continue
|
|
}
|
|
}
|
|
|
|
|
|
r(netip.AddrPortFrom(netip.AddrFrom16(rua.Addr).Unmap(), (rua.Port>>8)|((rua.Port&0xff)<<8)), buffer[:n])
|
|
r(netip.AddrPortFrom(netip.AddrFrom16(rua.Addr).Unmap(), (rua.Port>>8)|((rua.Port&0xff)<<8)), buffer[:n])
|