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  }