udp_server.go 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. package server
  2. import (
  3. "net"
  4. "runtime"
  5. "golang.org/x/net/ipv4"
  6. "golang.org/x/net/ipv6"
  7. )
  8. // UDPHandler udp handler
  9. type UDPHandler interface {
  10. Handler(*net.UDPConn)
  11. }
  12. // UDPServer udp server
  13. type UDPServer struct {
  14. addr *addr
  15. handler UDPHandler
  16. }
  17. // Start udp server start
  18. func (us *UDPServer) Start() error {
  19. if us.handler == nil {
  20. return errorf(errUDPHandlerNotRegisterd)
  21. }
  22. var ln *net.UDPConn
  23. var err error
  24. a, err := net.ResolveUDPAddr("udp", us.addr.internalIp)
  25. if err != nil {
  26. return err
  27. }
  28. ln, err = net.ListenUDP("udp", a)
  29. if err != nil {
  30. return errorf(errUDPListenFailed, us.addr, err)
  31. }
  32. Log.Infof("UDP Server Listen on %s", us.addr)
  33. if err := setUDPSocketOptions(ln); err != nil {
  34. return err
  35. }
  36. go us.handler.Handler(ln)
  37. return nil
  38. }
  39. func setUDPSocketOptions(conn *net.UDPConn) error {
  40. if runtime.GOOS == "windows" {
  41. return nil
  42. }
  43. if ip4 := conn.LocalAddr().(*net.UDPAddr).IP.To4(); ip4 != nil {
  44. return ipv4.NewPacketConn(conn).SetControlMessage(ipv4.FlagDst|ipv4.FlagInterface, true)
  45. }
  46. return ipv6.NewPacketConn(conn).SetControlMessage(ipv6.FlagDst|ipv6.FlagInterface, true)
  47. }