http urls monitor.

udp.go 2.0KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. package linker
  2. import (
  3. "fmt"
  4. "net"
  5. "github.com/wpajqz/linker/utils/convert"
  6. )
  7. func (s *Server) handleUDPData(conn *net.UDPConn, remote *net.UDPAddr, data []byte, length int) {
  8. bType := data[0:4]
  9. bSequence := data[4:12]
  10. bHeaderLength := data[12:16]
  11. sequence := convert.BytesToInt64(bSequence)
  12. headerLength := convert.BytesToUint32(bHeaderLength)
  13. header := data[20 : 20+headerLength]
  14. body := data[20+headerLength : length]
  15. rp, err := NewPacket(convert.BytesToUint32(bType), sequence, header, body, s.config.PluginForPacketReceiver)
  16. if err != nil {
  17. return
  18. }
  19. var ctx Context = NewContextUdp(conn, remote, rp.Operator, rp.Sequence, rp.Header, rp.Body, s.config)
  20. if rp.Operator == OPERATOR_HEARTBEAT {
  21. if s.pingHandler != nil {
  22. s.pingHandler.Handle(ctx)
  23. }
  24. ctx.Success(nil)
  25. }
  26. handler, ok := s.router.handlerContainer[rp.Operator]
  27. if !ok {
  28. ctx.Error(StatusInternalServerError, "server don't register your request.")
  29. }
  30. if rm, ok := s.router.routerMiddleware[rp.Operator]; ok {
  31. for _, v := range rm {
  32. ctx = v.Handle(ctx)
  33. }
  34. }
  35. for _, v := range s.router.middleware {
  36. ctx = v.Handle(ctx)
  37. if tm, ok := v.(TerminateMiddleware); ok {
  38. tm.Terminate(ctx)
  39. }
  40. }
  41. handler.Handle(ctx)
  42. ctx.Success(nil) // If it don't call the function of Success or Error, deal it by default
  43. }
  44. // 开始运行Tcp服务
  45. func (s *Server) RunUDP(name, address string) error {
  46. udpAddr, err := net.ResolveUDPAddr(name, address)
  47. if err != nil {
  48. return err
  49. }
  50. conn, err := net.ListenUDP(name, udpAddr)
  51. if err != nil {
  52. return err
  53. }
  54. defer conn.Close()
  55. fmt.Printf("udp server running on %s\n", address)
  56. if s.config.ReadBufferSize > 0 {
  57. conn.SetReadBuffer(s.config.ReadBufferSize)
  58. }
  59. if s.config.WriteBufferSize > 0 {
  60. conn.SetWriteBuffer(s.config.WriteBufferSize)
  61. }
  62. if s.constructHandler != nil {
  63. s.constructHandler.Handle(nil)
  64. }
  65. for {
  66. data := make([]byte, MaxPayload)
  67. n, remote, err := conn.ReadFromUDP(data)
  68. if err != nil {
  69. continue
  70. }
  71. go s.handleUDPData(conn, remote, data, n)
  72. }
  73. }