Last active
September 8, 2023 19:04
-
-
Save jbardin/9663312 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package nettimeout | |
import ( | |
"net" | |
"time" | |
) | |
// Listener wraps a net.Listener, and gives a place to store the timeout | |
// parameters. On Accept, it will wrap the net.Conn with our own Conn for us. | |
type Listener struct { | |
net.Listener | |
ReadTimeout time.Duration | |
WriteTimeout time.Duration | |
} | |
func (l *Listener) Accept() (net.Conn, error) { | |
c, err := l.Listener.Accept() | |
if err != nil { | |
return nil, err | |
} | |
tc := &Conn{ | |
Conn: c, | |
ReadTimeout: l.ReadTimeout, | |
WriteTimeout: l.WriteTimeout, | |
} | |
return tc, nil | |
} | |
// Conn wraps a net.Conn, and sets a deadline for every read | |
// and write operation. | |
type Conn struct { | |
net.Conn | |
ReadTimeout time.Duration | |
WriteTimeout time.Duration | |
} | |
func (c *Conn) Read(b []byte) (int, error) { | |
err := c.Conn.SetReadDeadline(time.Now().Add(c.ReadTimeout)) | |
if err != nil { | |
return 0, err | |
} | |
return c.Conn.Read(b) | |
} | |
func (c *Conn) Write(b []byte) (int, error) { | |
err := c.Conn.SetWriteDeadline(time.Now().Add(c.WriteTimeout)) | |
if err != nil { | |
return 0, err | |
} | |
return c.Conn.Write(b) | |
} | |
func NewListener(addr string, readTimeout, writeTimeout time.Duration) (net.Listener, error) { | |
l, err := net.Listen("tcp", addr) | |
if err != nil { | |
return nil, err | |
} | |
tl := &Listener{ | |
Listener: l, | |
ReadTimeout: readTimeout, | |
WriteTimeout: writeTimeout, | |
} | |
return tl, nil | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
If the size of data to read or write is very large but the network speed is very slow, then the total time needed to read/write may be larger than ReadTimeout/WriteTimeout and cause a timeout error. Will this situation still occur when the above code is used?