freedom.go 1.2 KB

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