bridge.go 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. package action
  2. import (
  3. "ehang.io/nps/lib/enet"
  4. "ehang.io/nps/lib/pool"
  5. "net"
  6. )
  7. var bridgeListener = enet.NewListener()
  8. var bridgePacketConn enet.PacketConn
  9. var packetBp = pool.NewBufferPool(1500)
  10. func GetBridgeListener() net.Listener {
  11. return bridgeListener
  12. }
  13. func GetBridgePacketConn() net.PacketConn {
  14. return bridgePacketConn
  15. }
  16. type BridgeAction struct {
  17. DefaultAction
  18. WritePacketConn net.PacketConn `json:"-"`
  19. }
  20. func (ba *BridgeAction) GetName() string {
  21. return "bridge"
  22. }
  23. func (ba *BridgeAction) GetZhName() string {
  24. return "转发到网桥"
  25. }
  26. func (ba *BridgeAction) Init() error {
  27. bridgePacketConn = enet.NewReaderPacketConn(ba.WritePacketConn, nil, ba.WritePacketConn.LocalAddr())
  28. return nil
  29. }
  30. func (ba *BridgeAction) RunConn(clientConn net.Conn) error {
  31. return bridgeListener.SendConn(clientConn)
  32. }
  33. func (ba *BridgeAction) RunConnWithAddr(clientConn net.Conn, addr string) error {
  34. return bridgeListener.SendConn(clientConn)
  35. }
  36. func (ba *BridgeAction) RunPacketConn(pc net.PacketConn) error {
  37. b := packetBp.Get()
  38. defer packetBp.Put(b)
  39. for {
  40. n, addr, err := pc.ReadFrom(b)
  41. if err != nil {
  42. break
  43. }
  44. err = bridgePacketConn.SendPacket(b[:n], addr)
  45. if err != nil {
  46. break
  47. }
  48. }
  49. return nil
  50. }