89ou 发表于 2018-9-20 10:40:03

golang官方实现如何对httpserver做频率限制(最大连接数限制)

// Copyright 2013 The Go Authors.All rights reserved.  

// Use of this source code is governed by a BSD-style  

// license that can be found in the LICENSE file.  

  

// Package netutil provides network utility functions, complementing the more  

// common ones in the net package.  
package netutil // import "golang.org/x/net/netutil"
  

  
import (
  
"net"
  
"sync"
  
)
  

  
// LimitListener returns a Listener that accepts at most n simultaneous
  
// connections from the provided Listener.
  
func LimitListener(l net.Listener, n int) net.Listener {
  
return &limitListener{l, make(chan struct{}, n)}
  
}
  

  
type limitListener struct {
  
net.Listener
  
sem chan struct{}
  
}
  

  
func (l *limitListener) acquire() { l.sem l.sem }
  

  
func (l *limitListener) Accept() (net.Conn, error) {
  //若connect chan已满,则会阻塞在此处
  
l.acquire()
  
c, err := l.Listener.Accept()
  
if err != nil {
  
l.release()
  
return nil, err
  
}

  
return &limitListenerConn{Conn: c,>  
}
  

  
type limitListenerConn struct {
  
net.Conn
  
releaseOnce sync.Once
  
release   func()
  
}
  

  
func (l *limitListenerConn) Close() error {
  
err := l.Conn.Close()
  
l.releaseOnce.Do(l.release)
  
return err
  
}


页: [1]
查看完整版本: golang官方实现如何对httpserver做频率限制(最大连接数限制)