freedom.go 1.2 KB

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