action.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. package action
  2. import (
  3. "ehang.io/nps/lib/common"
  4. "ehang.io/nps/lib/logger"
  5. "ehang.io/nps/lib/pool"
  6. "errors"
  7. "go.uber.org/zap"
  8. "net"
  9. "sync"
  10. )
  11. var bp = pool.NewBufferPool(MaxReadSize)
  12. const MaxReadSize = 32 * 1024
  13. var (
  14. _ Action = (*AdminAction)(nil)
  15. _ Action = (*BridgeAction)(nil)
  16. _ Action = (*LocalAction)(nil)
  17. _ Action = (*NpcAction)(nil)
  18. )
  19. type Action interface {
  20. GetName() string
  21. GetZhName() string
  22. Init() error
  23. RunConnWithAddr(net.Conn, string) error
  24. RunConn(net.Conn) error
  25. GetServeConnWithAddr(string) (net.Conn, error)
  26. GetServerConn() (net.Conn, error)
  27. CanServe() bool
  28. RunPacketConn(conn net.PacketConn) error
  29. }
  30. type DefaultAction struct {
  31. }
  32. func (ba *DefaultAction) GetName() string {
  33. return "default"
  34. }
  35. func (ba *DefaultAction) GetZhName() string {
  36. return "默认"
  37. }
  38. func (ba *DefaultAction) Init() error {
  39. return nil
  40. }
  41. func (ba *DefaultAction) RunConn(clientConn net.Conn) error {
  42. return errors.New("not supported")
  43. }
  44. func (ba *DefaultAction) CanServe() bool {
  45. return false
  46. }
  47. func (ba *DefaultAction) RunPacketConn(conn net.PacketConn) error {
  48. return errors.New("not supported")
  49. }
  50. func (ba *DefaultAction) GetServerConn() (net.Conn, error) {
  51. return nil, errors.New("can not get component connection")
  52. }
  53. func (ba *DefaultAction) GetServeConnWithAddr(addr string) (net.Conn, error) {
  54. return nil, errors.New("can not get component connection")
  55. }
  56. func (ba *DefaultAction) startCopy(c1 net.Conn, c2 net.Conn) {
  57. var wg sync.WaitGroup
  58. wg.Add(2)
  59. err := pool.CopyConnGoroutinePool.Invoke(&pool.CopyConnGpParams{
  60. Reader: c2,
  61. Writer: c1,
  62. Wg: &wg,
  63. })
  64. if err != nil {
  65. logger.Error("Invoke goroutine failed", zap.Error(err))
  66. return
  67. }
  68. buf := bp.Get()
  69. _, _ = common.CopyBuffer(c2, c1, buf)
  70. bp.Put(buf)
  71. if v, ok := c1.(*net.TCPConn); ok {
  72. _ = v.CloseRead()
  73. }
  74. if v, ok := c2.(*net.TCPConn); ok {
  75. _ = v.CloseWrite()
  76. }
  77. wg.Wait()
  78. }
  79. func (ba *DefaultAction) startCopyPacketConn(p1 net.PacketConn, p2 net.PacketConn) error {
  80. var wg sync.WaitGroup
  81. wg.Add(2)
  82. _ = pool.CopyPacketGoroutinePool.Invoke(&pool.CopyPacketGpParams{
  83. RPacket: p1,
  84. WPacket: p2,
  85. Wg: &wg,
  86. })
  87. _ = pool.CopyPacketGoroutinePool.Invoke(&pool.CopyPacketGpParams{
  88. RPacket: p2,
  89. WPacket: p1,
  90. Wg: &wg,
  91. })
  92. wg.Wait()
  93. return nil
  94. }