Package netutil provides network utility functions, complementing the more common ones in the net package.
import "golang.org/x/net/netutil"// LimitListener returns a Listener that accepts at most n simultaneous connections
func LimitListener(l net.Listener, n int) net.ListenerLimitListener returns a Listener that accepts at most n simultaneous connections from the provided Listener. This is useful for limiting resource usage in servers.
import (
"fmt"
"golang.org/x/net/netutil"
"net"
"net/http"
)
func startLimitedServer() error {
// Create listener
listener, err := net.Listen("tcp", ":8080")
if err != nil {
return err
}
// Limit to 100 simultaneous connections
limitedListener := netutil.LimitListener(listener, 100)
// Serve HTTP on limited listener
fmt.Println("Server listening on :8080 (max 100 connections)")
return http.Serve(limitedListener, http.DefaultServeMux)
}func createLimitedHTTPServer(maxConnections int) *http.Server {
listener, err := net.Listen("tcp", ":8080")
if err != nil {
panic(err)
}
limitedListener := netutil.LimitListener(listener, maxConnections)
server := &http.Server{
Handler: http.DefaultServeMux,
}
go server.Serve(limitedListener)
return server
}
// Usage:
// server := createLimitedHTTPServer(50)
// Server will accept at most 50 simultaneous connectionsimport (
"golang.org/x/net/netutil"
"log"
"net"
)
func runProtectedServer(handler func(net.Conn)) error {
listener, err := net.Listen("tcp", ":9000")
if err != nil {
return err
}
defer listener.Close()
// Protect against too many connections
limitedListener := netutil.LimitListener(listener, 25)
log.Println("Server ready, max 25 connections")
for {
conn, err := limitedListener.Accept()
if err != nil {
log.Printf("Accept error: %v", err)
continue
}
go handler(conn)
}
}