udp_windows.go 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. package nebula
  2. // Windows support is primarily implemented in udp_generic, besides NewListenConfig
  3. import (
  4. "fmt"
  5. "net"
  6. "syscall"
  7. )
  8. func NewListenConfig(multi bool) net.ListenConfig {
  9. return net.ListenConfig{
  10. Control: func(network, address string, c syscall.RawConn) error {
  11. var controlErr error
  12. err := c.Control(func(fd uintptr) {
  13. if err := syscall.SetsockoptInt(syscall.Handle(fd), syscall.SOL_SOCKET, syscall.SO_SNDBUF, 999999); err != nil {
  14. controlErr = fmt.Errorf("SO_SNDBUF failed: %v", err)
  15. return
  16. }
  17. })
  18. if err != nil {
  19. return err
  20. }
  21. if controlErr != nil {
  22. return controlErr
  23. }
  24. err = c.Control(func(fd uintptr) {
  25. if err := syscall.SetsockoptInt(syscall.Handle(fd), syscall.SOL_SOCKET, syscall.SO_RCVBUF, 999999); err != nil {
  26. controlErr = fmt.Errorf("SO_RCVBUF failed: %v", err)
  27. return
  28. }
  29. })
  30. if err != nil {
  31. return err
  32. }
  33. if controlErr != nil {
  34. return controlErr
  35. }
  36. if multi {
  37. // There is no way to support multiple listeners safely on Windows:
  38. // https://docs.microsoft.com/en-us/windows/desktop/winsock/using-so-reuseaddr-and-so-exclusiveaddruse
  39. return fmt.Errorf("multiple udp listeners not supported on windows")
  40. }
  41. return nil
  42. },
  43. }
  44. }
  45. func (u *udpConn) Rebind() error {
  46. return nil
  47. }