freedom.go 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. package tcp
  2. import (
  3. "io"
  4. "net"
  5. "github.com/v2ray/v2ray-core"
  6. v2net "github.com/v2ray/v2ray-core/net"
  7. )
  8. type VFreeConnection struct {
  9. vPoint *core.VPoint
  10. dest v2net.VAddress
  11. }
  12. func NewVFreeConnection(vp *core.VPoint, dest v2net.VAddress) *VFreeConnection {
  13. conn := new(VFreeConnection)
  14. conn.vPoint = vp
  15. conn.dest = dest
  16. return conn
  17. }
  18. func (vconn *VFreeConnection) Start(vRay core.OutboundVRay) error {
  19. input := vRay.OutboundInput()
  20. output := vRay.OutboundOutput()
  21. conn, err := net.Dial("tcp", vconn.dest.String())
  22. if err != nil {
  23. return err
  24. }
  25. finish := make(chan bool, 2)
  26. go vconn.DumpInput(conn, input, finish)
  27. go vconn.DumpOutput(conn, output, finish)
  28. go vconn.CloseConn(conn, finish)
  29. return nil
  30. }
  31. func (vconn *VFreeConnection) DumpInput(conn net.Conn, input <-chan []byte, finish chan<- bool) {
  32. for {
  33. data, open := <-input
  34. if !open {
  35. finish <- true
  36. break
  37. }
  38. conn.Write(data)
  39. }
  40. }
  41. func (vconn *VFreeConnection) DumpOutput(conn net.Conn, output chan<- []byte, finish chan<- bool) {
  42. for {
  43. buffer := make([]byte, 128)
  44. nBytes, err := conn.Read(buffer)
  45. if err == io.EOF {
  46. finish <- true
  47. break
  48. }
  49. output <- buffer[:nBytes]
  50. }
  51. }
  52. func (vconn *VFreeConnection) CloseConn(conn net.Conn, finish <-chan bool) {
  53. for i := 0; i < 2; i++ {
  54. <-finish
  55. }
  56. conn.Close()
  57. }