freedom.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  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. dest v2net.VAddress
  11. }
  12. func NewVFreeConnection(dest v2net.VAddress) *VFreeConnection {
  13. conn := new(VFreeConnection)
  14. conn.dest = dest
  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("tcp", vconn.dest.String())
  21. if err != nil {
  22. log.Print(err)
  23. return err
  24. }
  25. log.Print("Working on tcp:" + vconn.dest.String())
  26. finish := make(chan bool, 2)
  27. go vconn.DumpInput(conn, input, finish)
  28. go vconn.DumpOutput(conn, output, finish)
  29. go vconn.CloseConn(conn, finish)
  30. return nil
  31. }
  32. func (vconn *VFreeConnection) DumpInput(conn net.Conn, input <-chan []byte, finish chan<- bool) {
  33. for {
  34. data, open := <-input
  35. if !open {
  36. finish <- true
  37. break
  38. }
  39. conn.Write(data)
  40. }
  41. }
  42. func (vconn *VFreeConnection) DumpOutput(conn net.Conn, output chan<- []byte, finish chan<- bool) {
  43. for {
  44. buffer := make([]byte, 128)
  45. nBytes, err := conn.Read(buffer)
  46. if err == io.EOF {
  47. close(output)
  48. finish <- true
  49. break
  50. }
  51. log.Print(buffer[:nBytes])
  52. output <- buffer[:nBytes]
  53. }
  54. }
  55. func (vconn *VFreeConnection) CloseConn(conn net.Conn, finish <-chan bool) {
  56. for i := 0; i < 2; i++ {
  57. <-finish
  58. }
  59. conn.Close()
  60. }