github.com/codingeasygo/util@v0.0.0-20231206062002-1ce2f004b7d9/xio/echo.go (about) 1 package xio 2 3 import ( 4 "io" 5 "net" 6 "time" 7 ) 8 9 // EchoConn is net.Conn impl by os.Pipe 10 type EchoConn struct { 11 piped *PipedChan 12 } 13 14 // NewEchoConn will return new echo connection 15 func NewEchoConn() (conn *EchoConn) { 16 conn = &EchoConn{ 17 piped: NewPipedChan(), 18 } 19 return 20 } 21 22 func (e *EchoConn) Read(b []byte) (n int, err error) { 23 n, err = e.piped.Read(b) 24 return 25 } 26 27 func (e *EchoConn) Write(b []byte) (n int, err error) { 28 n, err = e.piped.Write(b) 29 return 30 } 31 32 // Close closes the connection. 33 func (e *EchoConn) Close() error { 34 e.piped.Close() 35 return nil 36 } 37 38 // LocalAddr returns the local network address. 39 func (e *EchoConn) LocalAddr() net.Addr { 40 return e 41 } 42 43 // RemoteAddr returns the remote network address. 44 func (e *EchoConn) RemoteAddr() net.Addr { 45 return e 46 } 47 48 // SetDeadline for net.Conn 49 func (e *EchoConn) SetDeadline(t time.Time) error { 50 return nil 51 } 52 53 // SetReadDeadline for net.Conn 54 func (e *EchoConn) SetReadDeadline(t time.Time) error { 55 return nil 56 } 57 58 // SetWriteDeadline for net.Conn 59 func (e *EchoConn) SetWriteDeadline(t time.Time) error { 60 return nil 61 } 62 63 // Network is net.Addr impl 64 func (e *EchoConn) Network() string { 65 return "echo" 66 } 67 68 func (e *EchoConn) String() string { 69 return "echo" 70 } 71 72 // EchoPiper is echo implement to Piper 73 type EchoPiper struct { 74 BufferSize int 75 } 76 77 // NewEchoPiper will return new EchoPiper 78 func NewEchoPiper(bufferSize int) (piper *EchoPiper) { 79 piper = &EchoPiper{BufferSize: bufferSize} 80 return 81 } 82 83 // PipeConn will process connection by as echo 84 func (e *EchoPiper) PipeConn(conn io.ReadWriteCloser, target string) (err error) { 85 _, err = io.CopyBuffer(conn, conn, make([]byte, e.BufferSize)) 86 return 87 } 88 89 // Close is empty implement for Piper 90 func (e *EchoPiper) Close() (err error) { 91 return 92 } 93 94 // EchoDialer is dialer test 95 type EchoDialer struct { 96 } 97 98 // NewEchoDialer will return new EchoDialer 99 func NewEchoDialer() (dialer *EchoDialer) { 100 dialer = &EchoDialer{} 101 return 102 } 103 104 // Dial dail one raw connection 105 func (e *EchoDialer) Dial(network, address string) (c net.Conn, err error) { 106 c = NewEchoConn() 107 return 108 } 109 110 // DialPiper will dial piper by target 111 func (e *EchoDialer) DialPiper(target string, bufferSize int) (raw Piper, err error) { 112 raw = NewEchoPiper(bufferSize) 113 return 114 }