123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- package tcp
- import (
- "bufio"
- "net"
- "time"
- )
- func errTimeout(err error) bool {
- if opErr, ok := err.(*net.OpError); ok {
- if opErr.Temporary() || opErr.Timeout() {
- return true
- }
- }
- return false
- }
- // Write tcp write
- func Write(conn *net.TCPConn, timeout time.Duration, data []byte) (n int, isTimeout bool, err error) {
- conn.SetWriteDeadline(time.Now().Add(timeout))
- n, err = conn.Write(data)
- if err != nil {
- isTimeout = errTimeout(err)
- }
- return
- }
- // Read tcp reads data into p.
- // It returns the number of bytes read into p.
- // The bytes are taken from at most one Read on the underlying Reader,
- // hence n may be less than len(p).
- // To read exactly len(p) bytes, use io.ReadFull(b, p).
- // At EOF, the count will be zero and err will be io.EOF.
- func Read(conn *net.TCPConn, timeout time.Duration, p []byte) (n int, isTimeout bool, err error) {
- buffer := bufio.NewReader(conn)
- conn.SetReadDeadline(time.Now().Add(timeout))
- n, err = buffer.Read(p)
- if err != nil {
- isTimeout = errTimeout(err)
- }
- return
- }
- // ReadBytes tcp reads until the first occurrence of delim in the input,
- // returning a slice containing the data up to and including the delimiter.
- // If ReadBytes encounters an error before finding a delimiter,
- // it returns the data read before the error and the error itself (often io.EOF).
- // ReadBytes returns err != nil if and only if the returned data does not end in
- // delim.
- // For simple uses, a Scanner may be more convenient.
- func ReadBytes(conn *net.TCPConn, timeout time.Duration, delim byte) (data []byte, isTimeout bool, err error) {
- buffer := bufio.NewReader(conn)
- conn.SetReadDeadline(time.Now().Add(timeout))
- data, err = buffer.ReadBytes(delim)
- if err != nil {
- isTimeout = errTimeout(err)
- }
- return
- }
- // Optimize TCP connect optimize
- func Optimize(conn *net.TCPConn) (err error) {
- err = conn.SetNoDelay(true)
- if err != nil {
- return
- }
- err = conn.SetKeepAlive(true)
- if err != nil {
- return
- }
- err = conn.SetKeepAlivePeriod(3 * time.Minute)
- return
- }
|