You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

65 lines
1.3 KiB

  1. package util
  2. import (
  3. "net"
  4. "time"
  5. )
  6. // Listener wraps a net.Listener, and gives a place to store the timeout
  7. // parameters. On Accept, it will wrap the net.Conn with our own Conn for us.
  8. type Listener struct {
  9. net.Listener
  10. ReadTimeout time.Duration
  11. WriteTimeout time.Duration
  12. }
  13. func (l *Listener) Accept() (net.Conn, error) {
  14. c, err := l.Listener.Accept()
  15. if err != nil {
  16. return nil, err
  17. }
  18. tc := &Conn{
  19. Conn: c,
  20. ReadTimeout: l.ReadTimeout,
  21. WriteTimeout: l.WriteTimeout,
  22. }
  23. return tc, nil
  24. }
  25. // Conn wraps a net.Conn, and sets a deadline for every read
  26. // and write operation.
  27. type Conn struct {
  28. net.Conn
  29. ReadTimeout time.Duration
  30. WriteTimeout time.Duration
  31. }
  32. func (c *Conn) Read(b []byte) (int, error) {
  33. err := c.Conn.SetReadDeadline(time.Now().Add(c.ReadTimeout))
  34. if err != nil {
  35. return 0, err
  36. }
  37. return c.Conn.Read(b)
  38. }
  39. func (c *Conn) Write(b []byte) (int, error) {
  40. err := c.Conn.SetWriteDeadline(time.Now().Add(c.WriteTimeout))
  41. if err != nil {
  42. return 0, err
  43. }
  44. return c.Conn.Write(b)
  45. }
  46. func NewListener(addr string, timeout time.Duration) (net.Listener, error) {
  47. l, err := net.Listen("tcp", addr)
  48. if err != nil {
  49. return nil, err
  50. }
  51. tl := &Listener{
  52. Listener: l,
  53. ReadTimeout: timeout,
  54. WriteTimeout: timeout,
  55. }
  56. return tl, nil
  57. }