udp.go 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  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. "net"
  9. "strings"
  10. )
  11. type UdpModeServer struct {
  12. server
  13. listener *net.UDPConn
  14. udpMap map[string]*conn.Conn
  15. }
  16. func NewUdpModeServer(bridge *bridge.Bridge, task *file.Tunnel) *UdpModeServer {
  17. s := new(UdpModeServer)
  18. s.bridge = bridge
  19. s.udpMap = make(map[string]*conn.Conn)
  20. s.task = task
  21. return s
  22. }
  23. //开始
  24. func (s *UdpModeServer) Start() error {
  25. var err error
  26. s.listener, err = net.ListenUDP("udp", &net.UDPAddr{net.ParseIP("0.0.0.0"), s.task.Port, ""})
  27. if err != nil {
  28. return err
  29. }
  30. buf := pool.BufPoolUdp.Get().([]byte)
  31. for {
  32. n, addr, err := s.listener.ReadFromUDP(buf)
  33. if err != nil {
  34. if strings.Contains(err.Error(), "use of closed network connection") {
  35. break
  36. }
  37. continue
  38. }
  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(s.task.Client.GetId(), common.CONN_UDP, s.task.Target, s.task.Client.Cnf.CompressEncode, s.task.Client.Cnf.CompressDecode, s.task.Client.Cnf.Crypt, nil, s.task.Flow, s.listener, s.task.Client.Rate, addr)
  45. if err := s.checkFlow(); err != nil {
  46. return
  47. }
  48. if tunnel, err := s.bridge.SendLinkInfo(s.task.Client.Id, link, addr.String()); err != nil {
  49. return
  50. } else {
  51. s.task.Flow.Add(len(data), 0)
  52. tunnel.SendMsg(data, link)
  53. pool.PutBufPoolUdp(data)
  54. link.Run(true)
  55. }
  56. }
  57. func (s *UdpModeServer) Close() error {
  58. return s.listener.Close()
  59. }