udp.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  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. crypt bool
  20. }
  21. func NewUdpModeServer(udpPort int, tunnelTarget string, bridge *Tunnel, enCompress int, deCompress int, vKey string, crypt bool) *UdpModeServer {
  22. s := new(UdpModeServer)
  23. s.udpPort = udpPort
  24. s.tunnelTarget = tunnelTarget
  25. s.bridge = bridge
  26. s.udpMap = make(map[string]*Conn)
  27. s.enCompress = enCompress
  28. s.deCompress = deCompress
  29. s.vKey = vKey
  30. s.crypt = crypt
  31. return s
  32. }
  33. //开始
  34. func (s *UdpModeServer) Start() error {
  35. s.listener, err = net.ListenUDP("udp", &net.UDPAddr{net.ParseIP("0.0.0.0"), s.udpPort, ""})
  36. if err != nil {
  37. return err
  38. }
  39. data := make([]byte, 1472) //udp数据包大小
  40. for {
  41. n, addr, err := s.listener.ReadFromUDP(data)
  42. if err != nil {
  43. if strings.Contains(err.Error(), "use of closed network connection") {
  44. break
  45. }
  46. log.Println(err)
  47. continue
  48. }
  49. go s.process(addr, data[:n])
  50. }
  51. return nil
  52. }
  53. //TODO:效率问题有待解决
  54. func (s *UdpModeServer) process(addr *net.UDPAddr, data []byte) {
  55. fmt.Println(addr.String())
  56. fmt.Println(string(data))
  57. conn, err := s.bridge.GetTunnel(getverifyval(s.vKey), s.enCompress, s.deCompress, s.crypt)
  58. if err != nil {
  59. log.Println(err)
  60. return
  61. }
  62. if _, err := conn.WriteHost(CONN_UDP, s.tunnelTarget); err != nil {
  63. conn.Close()
  64. return
  65. }
  66. conn.WriteCompress(data, s.enCompress)
  67. go func(addr *net.UDPAddr, conn *Conn) {
  68. buf := make([]byte, 1024)
  69. conn.conn.SetReadDeadline(time.Now().Add(time.Duration(time.Second * 3)))
  70. n, err := conn.ReadFromCompress(buf, s.deCompress)
  71. if err != nil || err == io.EOF {
  72. conn.Close()
  73. return
  74. }
  75. s.listener.WriteToUDP(buf[:n], addr)
  76. conn.Close()
  77. }(addr, conn)
  78. }
  79. func (s *UdpModeServer) Close() error {
  80. return s.listener.Close()
  81. }