clientConn.go 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. // +build !confonly
  2. package encoding
  3. import (
  4. "bytes"
  5. "io"
  6. "net"
  7. "time"
  8. )
  9. type ClientConn struct {
  10. client GunService_TunClient
  11. reader io.Reader
  12. }
  13. func (*ClientConn) LocalAddr() net.Addr {
  14. return nil
  15. }
  16. func (*ClientConn) RemoteAddr() net.Addr {
  17. return nil
  18. }
  19. func (*ClientConn) SetDeadline(time.Time) error {
  20. return nil
  21. }
  22. func (*ClientConn) SetReadDeadline(time.Time) error {
  23. return nil
  24. }
  25. func (*ClientConn) SetWriteDeadline(time.Time) error {
  26. return nil
  27. }
  28. func (s *ClientConn) Read(b []byte) (n int, err error) {
  29. if s.reader == nil {
  30. h, err := s.client.Recv()
  31. if err != nil {
  32. return 0, newError("unable to read from gun tunnel").Base(err)
  33. }
  34. s.reader = bytes.NewReader(h.Data)
  35. }
  36. n, err = s.reader.Read(b)
  37. if err == io.EOF {
  38. s.reader = nil
  39. return n, nil
  40. }
  41. return n, err
  42. }
  43. func (s *ClientConn) Write(b []byte) (n int, err error) {
  44. err = s.client.Send(&Hunk{Data: b})
  45. if err != nil {
  46. return 0, newError("Unable to send data over gun").Base(err)
  47. }
  48. return len(b), nil
  49. }
  50. func (s *ClientConn) Close() error {
  51. return s.client.CloseSend()
  52. }
  53. func NewClientConn(client GunService_TunClient) *ClientConn {
  54. return &ClientConn{
  55. client: client,
  56. reader: nil,
  57. }
  58. }