udp.go 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. package proxy
  2. import (
  3. "github.com/cnlh/nps/bridge"
  4. "github.com/cnlh/nps/lib/common"
  5. "github.com/cnlh/nps/lib/conn"
  6. "github.com/cnlh/nps/lib/file"
  7. "github.com/cnlh/nps/lib/pool"
  8. "github.com/cnlh/nps/vender/github.com/astaxie/beego/logs"
  9. "net"
  10. "strings"
  11. )
  12. type UdpModeServer struct {
  13. BaseServer
  14. listener *net.UDPConn
  15. }
  16. func NewUdpModeServer(bridge *bridge.Bridge, task *file.Tunnel) *UdpModeServer {
  17. s := new(UdpModeServer)
  18. s.bridge = bridge
  19. s.task = task
  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.task.Port, ""})
  26. if err != nil {
  27. return err
  28. }
  29. buf := pool.BufPoolUdp.Get().([]byte)
  30. for {
  31. n, addr, err := s.listener.ReadFromUDP(buf)
  32. if err != nil {
  33. if strings.Contains(err.Error(), "use of closed network connection") {
  34. break
  35. }
  36. continue
  37. }
  38. logs.Trace("New udp connection,client %d,remote address %s", s.task.Client.Id, addr)
  39. go s.process(addr, buf[:n])
  40. }
  41. return nil
  42. }
  43. func (s *UdpModeServer) process(addr *net.UDPAddr, data []byte) {
  44. link := conn.NewLink(common.CONN_UDP, s.task.Target, s.task.Client.Cnf.Crypt, s.task.Client.Cnf.Compress, addr.String())
  45. if err := s.checkFlow(); err != nil {
  46. return
  47. }
  48. if target, err := s.bridge.SendLinkInfo(s.task.Client.Id, link, addr.String(), s.task); err != nil {
  49. return
  50. } else {
  51. s.task.Flow.Add(int64(len(data)), 0)
  52. buf := pool.BufPoolUdp.Get().([]byte)
  53. defer pool.BufPoolUdp.Put(buf)
  54. target.Write(data)
  55. s.task.Flow.Add(int64(len(data)), 0)
  56. if n, err := target.Read(buf); err != nil {
  57. logs.Warn(err)
  58. return
  59. } else {
  60. s.listener.WriteTo(buf[:n], addr)
  61. s.task.Flow.Add(0, int64(n))
  62. }
  63. }
  64. }
  65. func (s *UdpModeServer) Close() error {
  66. return s.listener.Close()
  67. }