listen.go 991 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. // Copyright 2013 The Go Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. // Package netutil provides network utility functions, complementing the more
  5. // common ones in the net package.
  6. package netutil
  7. import "net"
  8. // LimitListener returns a Listener that accepts at most n simultaneous
  9. // connections from the provided Listener.
  10. func LimitListener(l net.Listener, n int) net.Listener {
  11. ch := make(chan struct{}, n)
  12. for i := 0; i < n; i++ {
  13. ch <- struct{}{}
  14. }
  15. return &limitListener{l, ch}
  16. }
  17. type limitListener struct {
  18. net.Listener
  19. ch chan struct{}
  20. }
  21. func (l *limitListener) Accept() (net.Conn, error) {
  22. <-l.ch
  23. c, err := l.Listener.Accept()
  24. if err != nil {
  25. return nil, err
  26. }
  27. return &limitListenerConn{c, l.ch}, nil
  28. }
  29. type limitListenerConn struct {
  30. net.Conn
  31. ch chan<- struct{}
  32. }
  33. func (l *limitListenerConn) Close() error {
  34. err := l.Conn.Close()
  35. l.ch <- struct{}{}
  36. return err
  37. }