freedom.go 1.4 KB

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