udp.go 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. package lib
  2. import (
  3. "fmt"
  4. "io"
  5. "log"
  6. "net"
  7. "strings"
  8. "time"
  9. )
  10. type UdpModeServer struct {
  11. bridge *Tunnel
  12. udpPort int //监听的udp端口
  13. tunnelTarget string //udp目标地址
  14. listener *net.UDPConn
  15. udpMap map[string]*Conn
  16. enCompress int
  17. deCompress int
  18. vKey string
  19. }
  20. func NewUdpModeServer(udpPort int, tunnelTarget string, bridge *Tunnel, enCompress int, deCompress int, vKey string) *UdpModeServer {
  21. s := new(UdpModeServer)
  22. s.udpPort = udpPort
  23. s.tunnelTarget = tunnelTarget
  24. s.bridge = bridge
  25. s.udpMap = make(map[string]*Conn)
  26. s.enCompress = enCompress
  27. s.deCompress = deCompress
  28. s.vKey = vKey
  29. return s
  30. }
  31. //开始
  32. func (s *UdpModeServer) Start() error {
  33. s.listener, err = net.ListenUDP("udp", &net.UDPAddr{net.ParseIP("0.0.0.0"), s.udpPort, ""})
  34. if err != nil {
  35. return err
  36. }
  37. data := make([]byte, 1472) //udp数据包大小
  38. for {
  39. n, addr, err := s.listener.ReadFromUDP(data)
  40. if err != nil {
  41. if strings.Contains(err.Error(), "use of closed network connection") {
  42. break
  43. }
  44. log.Println(err)
  45. continue
  46. }
  47. go s.process(addr, data[:n])
  48. }
  49. return nil
  50. }
  51. //TODO:效率问题有待解决
  52. func (s *UdpModeServer) process(addr *net.UDPAddr, data []byte) {
  53. fmt.Println(addr.String())
  54. fmt.Println(string(data))
  55. conn := s.bridge.GetTunnel(getverifyval(s.vKey),s.enCompress,s.deCompress)
  56. if _, err := conn.WriteHost(CONN_UDP, s.tunnelTarget); err != nil {
  57. conn.Close()
  58. return
  59. }
  60. conn.WriteCompress(data, s.enCompress)
  61. go func(addr *net.UDPAddr, conn *Conn) {
  62. buf := make([]byte, 1024)
  63. conn.conn.SetReadDeadline(time.Now().Add(time.Duration(time.Second * 3)))
  64. n, err := conn.ReadFromCompress(buf, s.deCompress)
  65. if err != nil || err == io.EOF {
  66. conn.Close()
  67. return
  68. }
  69. s.listener.WriteToUDP(buf[:n], addr)
  70. conn.Close()
  71. }(addr, conn)
  72. }
  73. func (s *UdpModeServer) Close() error {
  74. return s.listener.Close()
  75. }