1 // Deadlined socket read/write. https://github.com/golang/go/issues/16100
10 type DeadlinedConn struct {
12 ReadTimeout time.Duration
13 WriteTimeout time.Duration
16 BytesReadFromDeadline int64
17 BytesWrittenFromDeadline int64
20 func (c *DeadlinedConn) Read(b []byte) (n int, err error) {
21 if c.BytesReadFromDeadline > c.ReadThreshold {
22 c.BytesReadFromDeadline = 0
23 err = c.Conn.SetDeadline(time.Now().Add(c.ReadTimeout))
28 n, err = c.Conn.Read(b)
29 c.BytesReadFromDeadline += int64(n)
33 func (c *DeadlinedConn) Write(b []byte) (n int, err error) {
34 if c.BytesWrittenFromDeadline > c.WriteThreshold {
35 c.BytesWrittenFromDeadline = 0
36 err = c.Conn.SetWriteDeadline(time.Now().Add(c.WriteTimeout))
41 n, err = c.Conn.Write(b)
42 c.BytesWrittenFromDeadline += int64(n)
46 type DeadlinedListener struct {
48 ReadTimeout time.Duration
49 WriteTimeout time.Duration
52 func (l *DeadlinedListener) Accept() (net.Conn, error) {
53 c, err := l.Listener.Accept()
57 return &DeadlinedConn{
59 ReadTimeout: l.ReadTimeout,
60 WriteTimeout: l.WriteTimeout,
61 ReadThreshold: int64((l.ReadTimeout * 1024) / time.Second),
62 WriteThreshold: int64((l.WriteTimeout * 1024) / time.Second),
68 readTimeout, writeTimeout time.Duration,
69 ) (net.Listener, error) {
70 l, err := net.Listen(network, addr)
74 return &DeadlinedListener{
76 ReadTimeout: readTimeout,
77 WriteTimeout: writeTimeout,