| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 | 
							- package network
 
- import (
 
- 	"net"
 
- 	"sync"
 
- 	"time"
 
- )
 
- type TCPListener struct {
 
- 	net.Listener
 
- }
 
- func (l *TCPListener) Accept() (net.Conn, error) {
 
- 	conn, err := l.Listener.Accept()
 
- 	if err != nil {
 
- 		return nil, err
 
- 	}
 
- 	_ = conn.(*net.TCPConn).SetKeepAlivePeriod(15 * time.Second)
 
- 	_ = conn.(*net.TCPConn).SetKeepAlive(true)
 
- 	_ = conn.(*net.TCPConn).SetNoDelay(true)
 
- 	return &TCPConn{connected: true, conn: conn}, nil
 
- }
 
- type TCPConn struct {
 
- 	connected bool
 
- 	conn net.Conn
 
- 	// rDeadline 用于 Read 等待超时时间, 优先级高于 deadline
 
- 	rDeadline time.Time
 
- 	// wDeadline 用于 Write 等待超时时间, 优先级高于 deadline
 
- 	wDeadline time.Time
 
- 	// deadline 超时时间, 适用于 Read 和 Write, 当 rDeadline 和 wDeadline 不存在时生效
 
- 	deadline time.Time
 
- 	mu sync.Mutex
 
- }
 
- func (s *TCPConn) Read(b []byte) (n int, err error) {
 
- 	if !s.connected {
 
- 		return 0, ErrClosed
 
- 	}
 
- 	s.mu.Lock()
 
- 	defer s.mu.Unlock()
 
- 	if err = setReadDeadline(s.conn, s.rDeadline, s.deadline); err != nil {
 
- 		return 0, err
 
- 	}
 
- 	if cap(b) == 0 {
 
- 		b = defaultPool.Get().([]byte)
 
- 		defaultPool.Put(b)
 
- 	}
 
- 	return s.conn.Read(b)
 
- }
 
- func (s *TCPConn) Write(b []byte) (n int, err error) {
 
- 	if !s.connected {
 
- 		return 0, ErrClosed
 
- 	}
 
- 	s.mu.Lock()
 
- 	defer s.mu.Unlock()
 
- 	if err = setWriteDeadline(s.conn, s.wDeadline, s.deadline); err != nil {
 
- 		return 0, err
 
- 	}
 
- 	return s.conn.Write(b)
 
- }
 
- func (s *TCPConn) Close() error {
 
- 	s.mu.Lock()
 
- 	s.connected = false
 
- 	err := s.conn.Close()
 
- 	s.mu.Unlock()
 
- 	return err
 
- }
 
- func (s *TCPConn) LocalAddr() net.Addr {
 
- 	return s.conn.LocalAddr()
 
- }
 
- func (s *TCPConn) RemoteAddr() net.Addr {
 
- 	return s.conn.RemoteAddr()
 
- }
 
- func (s *TCPConn) SetDeadline(t time.Time) error {
 
- 	s.deadline = t
 
- 	return nil
 
- }
 
- func (s *TCPConn) SetReadDeadline(t time.Time) error {
 
- 	s.rDeadline = t
 
- 	return nil
 
- }
 
- func (s *TCPConn) SetWriteDeadline(t time.Time) error {
 
- 	s.wDeadline = t
 
- 	return nil
 
- }
 
 
  |