ForwardClient.go 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. package Service
  2. import (
  3. "io"
  4. "net"
  5. "github.com/astaxie/beego/logs"
  6. )
  7. type ForWardClient struct {
  8. SrcConn net.Conn
  9. DestConn net.Conn
  10. ClosedCallBack func(srcConn net.Conn, destConn net.Conn)
  11. }
  12. func (_self *ForWardClient) StartForward() {
  13. //io.Copy(dst, src)
  14. go func() {
  15. _, err := io.Copy(_self.DestConn, _self.SrcConn)
  16. if err != nil {
  17. //logs.Error("客户端来源数据转发到目标端口异常:", err)
  18. _self.StopForward()
  19. }
  20. }()
  21. go func() {
  22. _, err := io.Copy(_self.SrcConn, _self.DestConn)
  23. if err != nil {
  24. //logs.Error("目标端口返回响应数据异常:", err)
  25. _self.StopForward()
  26. }
  27. }()
  28. }
  29. func (_self *ForWardClient) DispatchData(dispatchConns []io.Writer) {
  30. //将数据克隆给其它端口
  31. go func() {
  32. mWriter := io.MultiWriter(dispatchConns...)
  33. _, err := io.Copy(mWriter, _self.SrcConn)
  34. if err != nil {
  35. logs.Error("Dispatch网络连接异常:", err)
  36. }
  37. }()
  38. }
  39. func (_self *ForWardClient) StopForward() {
  40. //logs.Debug("关闭一个连接:", _self.SrcConn.RemoteAddr()," on ", _self.SrcConn.LocalAddr())
  41. _self.SrcConn.Close()
  42. _self.DestConn.Close()
  43. _self.ClosedCallBack(_self.SrcConn, _self.DestConn)
  44. }
粤ICP备19079148号