udp.go 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. package server
  2. import (
  3. "github.com/cnlh/easyProxy/bridge"
  4. "github.com/cnlh/easyProxy/utils"
  5. "io"
  6. "log"
  7. "net"
  8. "strings"
  9. )
  10. type UdpModeServer struct {
  11. server
  12. listener *net.UDPConn
  13. udpMap map[string]*utils.Conn
  14. }
  15. func NewUdpModeServer(bridge *bridge.Tunnel, cnf *utils.ServerConfig) *UdpModeServer {
  16. s := new(UdpModeServer)
  17. s.bridge = bridge
  18. s.udpMap = make(map[string]*utils.Conn)
  19. s.config = cnf
  20. return s
  21. }
  22. //开始
  23. func (s *UdpModeServer) Start() error {
  24. var err error
  25. s.listener, err = net.ListenUDP("udp", &net.UDPAddr{net.ParseIP("0.0.0.0"), s.config.TcpPort, ""})
  26. if err != nil {
  27. return err
  28. }
  29. data := make([]byte, 1472) //udp数据包大小
  30. for {
  31. n, addr, err := s.listener.ReadFromUDP(data)
  32. if err != nil {
  33. if strings.Contains(err.Error(), "use of closed network connection") {
  34. break
  35. }
  36. continue
  37. }
  38. s.ResetConfig()
  39. go s.process(addr, data[:n])
  40. }
  41. return nil
  42. }
  43. //TODO:效率问题有待解决
  44. func (s *UdpModeServer) process(addr *net.UDPAddr, data []byte) {
  45. conn, err := s.bridge.GetTunnel(s.config.ClientId, s.config.CompressEncode, s.config.CompressDecode, s.config.Crypt, s.config.Mux)
  46. if err != nil {
  47. log.Println(err)
  48. return
  49. }
  50. if _, err := conn.WriteHost(utils.CONN_UDP, s.config.Target); err != nil {
  51. conn.Close()
  52. return
  53. }
  54. if flag, err := conn.ReadFlag(); err == nil {
  55. defer func() {
  56. if conn != nil && s.config.Mux {
  57. conn.WriteTo([]byte(utils.IO_EOF), s.config.CompressEncode, s.config.Crypt)
  58. s.bridge.ReturnTunnel(conn, s.config.ClientId)
  59. } else {
  60. conn.Close()
  61. }
  62. }()
  63. if flag == utils.CONN_SUCCESS {
  64. in, _ := conn.WriteTo(data, s.config.CompressEncode, s.config.Crypt)
  65. buf := utils.BufPoolUdp.Get().([]byte)
  66. out, err := conn.ReadFrom(buf, s.config.CompressDecode, s.config.Crypt)
  67. if err != nil || err == io.EOF {
  68. log.Println("revieve error:", err)
  69. return
  70. }
  71. s.listener.WriteToUDP(buf[:out], addr)
  72. s.FlowAdd(int64(in), int64(out))
  73. utils.BufPoolUdp.Put(buf)
  74. }
  75. }
  76. }
  77. func (s *UdpModeServer) Close() error {
  78. return s.listener.Close()
  79. }