udp.go 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. package server
  2. import (
  3. "ehang.io/nps/core/handler"
  4. "ehang.io/nps/lib/logger"
  5. "github.com/panjf2000/ants/v2"
  6. "go.uber.org/zap"
  7. "net"
  8. )
  9. type UdpServer struct {
  10. ServerAddr string `json:"server_addr" required:"true" placeholder:"0.0.0.0:8080 or :8080" zh_name:"监听地址"`
  11. gp *ants.PoolWithFunc
  12. packetConn net.PacketConn
  13. handlers map[string]handler.Handler
  14. }
  15. type udpPacket struct {
  16. n int
  17. buf []byte
  18. addr net.Addr
  19. }
  20. func (us *UdpServer) Init() error {
  21. us.handlers = make(map[string]handler.Handler, 0)
  22. if err := us.listen(); err != nil {
  23. return err
  24. }
  25. var err error
  26. us.gp, err = ants.NewPoolWithFunc(1000000, func(i interface{}) {
  27. p := i.(*udpPacket)
  28. defer bp.Put(p.buf)
  29. logger.Debug("accept a now packet", zap.String("remote addr", p.addr.String()))
  30. })
  31. return err
  32. }
  33. func (us *UdpServer) GetServerAddr() string {
  34. if us.packetConn == nil {
  35. return us.ServerAddr
  36. }
  37. return us.packetConn.LocalAddr().String()
  38. }
  39. func (us *UdpServer) GetName() string {
  40. return "udp"
  41. }
  42. func (us *UdpServer) GetZhName() string {
  43. return "udp服务"
  44. }
  45. func (us *UdpServer) listen() error {
  46. addr, err := net.ResolveUDPAddr("udp", us.ServerAddr)
  47. if err != nil {
  48. return err
  49. }
  50. us.packetConn, err = net.ListenUDP("udp", addr)
  51. if err != nil {
  52. return err
  53. }
  54. return nil
  55. }
  56. func (us *UdpServer) Serve() {
  57. for {
  58. buf := bp.Get()
  59. n, addr, err := us.packetConn.ReadFrom(buf)
  60. if err != nil {
  61. logger.Error("accept packet failed", zap.Error(err))
  62. break
  63. }
  64. err = us.gp.Invoke(udpPacket{n: n, buf: buf, addr: addr})
  65. if err != nil {
  66. logger.Error("Invoke error", zap.Error(err))
  67. }
  68. }
  69. }