http urls monitor.

context_udp.go 2.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. package linker
  2. import (
  3. "context"
  4. "hash/crc32"
  5. "net"
  6. "runtime"
  7. "strconv"
  8. "github.com/wpajqz/linker/codec"
  9. )
  10. var _ Context = new(ContextUdp)
  11. type ContextUdp struct {
  12. common
  13. remote *net.UDPAddr
  14. Conn *net.UDPConn
  15. }
  16. func NewContextUdp(conn *net.UDPConn, remote *net.UDPAddr, OperateType uint32, Sequence int64, Header, Body []byte, config Config) *ContextUdp {
  17. return &ContextUdp{
  18. common: common{
  19. config: config,
  20. operateType: OperateType,
  21. sequence: Sequence,
  22. Context: context.Background(),
  23. Request: struct{ Header, Body []byte }{Header: Header, Body: Body},
  24. body: Body,
  25. },
  26. Conn: conn,
  27. remote: remote,
  28. }
  29. }
  30. // 响应请求成功的数据包
  31. func (c *ContextUdp) Success(body interface{}) {
  32. r, err := codec.NewCoder(c.config.ContentType)
  33. if err != nil {
  34. panic(err)
  35. }
  36. data, err := r.Encoder(body)
  37. if err != nil {
  38. panic(err)
  39. }
  40. p, err := NewPacket(c.operateType, c.sequence, c.Response.Header, data, c.config.PluginForPacketSender)
  41. if err != nil {
  42. panic(err)
  43. }
  44. c.Conn.WriteToUDP(p.Bytes(), c.remote)
  45. runtime.Goexit()
  46. }
  47. // 响应请求失败的数据包
  48. func (c *ContextUdp) Error(code int, message string) {
  49. c.SetResponseProperty("code", strconv.Itoa(code))
  50. c.SetResponseProperty("message", message)
  51. p, err := NewPacket(c.operateType, c.sequence, c.Response.Header, nil, c.config.PluginForPacketSender)
  52. if err != nil {
  53. panic(err)
  54. }
  55. c.Conn.WriteToUDP(p.Bytes(), c.remote)
  56. runtime.Goexit()
  57. }
  58. // 向客户端发送数据
  59. func (c *ContextUdp) Write(operator string, body interface{}) (int, error) {
  60. r, err := codec.NewCoder(c.config.ContentType)
  61. if err != nil {
  62. return 0, err
  63. }
  64. data, err := r.Encoder(body)
  65. if err != nil {
  66. return 0, err
  67. }
  68. p, err := NewPacket(crc32.ChecksumIEEE([]byte(operator)), 0, c.Response.Header, data, c.config.PluginForPacketSender)
  69. if err != nil {
  70. panic(err)
  71. }
  72. return c.Conn.WriteToUDP(p.Bytes(), c.remote)
  73. }
  74. func (c *ContextUdp) LocalAddr() string {
  75. return c.Conn.LocalAddr().String()
  76. }
  77. func (c *ContextUdp) RemoteAddr() string {
  78. return c.Conn.RemoteAddr().String()
  79. }