ForwardClient.go 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  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. DispatchConns []io.Writer
  11. ClosedCallBack func(srcConn net.Conn, destConn net.Conn)
  12. }
  13. func (_self *ForWardClient) StartForward() {
  14. //io.Copy(dst, src)
  15. go func() {
  16. _, err := io.Copy(_self.DestConn, _self.SrcConn)
  17. if err != nil {
  18. //logs.Error("客户端来源数据转发到目标端口异常:", err)
  19. _self.StopForward()
  20. }
  21. }()
  22. go func() {
  23. _, err := io.Copy(_self.SrcConn, _self.DestConn)
  24. if err != nil {
  25. //logs.Error("目标端口返回响应数据异常:", err)
  26. _self.StopForward()
  27. }
  28. }()
  29. }
  30. func (_self *ForWardClient) DispatchData(dispatchConns []io.Writer) {
  31. //将数据克隆给其它端口
  32. go func() {
  33. mWriter := io.MultiWriter(append(dispatchConns, _self.DestConn)...)
  34. _, err := io.Copy(mWriter, _self.SrcConn)
  35. if err != nil {
  36. logs.Error("Dispatch网络连接异常:", err)
  37. _self.StopForward()
  38. }
  39. }()
  40. go func() {
  41. _, err := io.Copy(_self.SrcConn, _self.DestConn)
  42. if err != nil {
  43. //logs.Error("目标端口返回响应数据异常:", err)
  44. _self.StopForward()
  45. }
  46. }()
  47. }
  48. func (_self *ForWardClient) StopForward() {
  49. logs.Debug("关闭一个连接:", _self.SrcConn.RemoteAddr(), " on ", _self.SrcConn.LocalAddr())
  50. _self.SrcConn.Close()
  51. _self.DestConn.Close()
  52. _self.ClosedCallBack(_self.SrcConn, _self.DestConn)
  53. }
粤ICP备19079148号