我是靠谱客的博主 畅快爆米花,最近开发中收集的这篇文章主要介绍Go1.9安全的限制net.Listener接入连接数,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

package main

import (
    "fmt"
    "net"
    "sync"
    "sync/atomic"
)

func main() {
    lis, err := net.Listen("tcp", ":1789")
    if err != nil {
        return
    }

    lis = LimitListener(lis, 1)
}

func LimitListener(l net.Listener, n int) net.Listener {
    return &limitListener{l, 0, make(chan struct{}, n)}
}

type limitListener struct {
    net.Listener
    closed int32
    limit  chan struct{}
}

func (l *limitListener) acquire() { l.limit <- struct{}{} }

func (l *limitListener) release() { <-l.limit }

func (l *limitListener) shutdown() bool { return atomic.LoadInt32(&l.closed) != 0 }

func (l *limitListener) Accept() (net.Conn, error) {
    if l.shutdown() {
        return nil, fmt.Errorf("accept tcp %s: use of closed network connection", l.Listener.Addr().String())
    }
    l.acquire()
    c, err := l.Listener.Accept()
    if err != nil {
        l.release()
        return nil, err
    }
    return &limitListenerConn{Conn: c, release: l.release}, nil
}

func (l *limitListener) Close() error {
    if l.shutdown() {
        return nil
    }
    atomic.StoreInt32(&l.closed, 1)
    close(l.limit)
    return l.Listener.Close()
}

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
}

最后

以上就是畅快爆米花为你收集整理的Go1.9安全的限制net.Listener接入连接数的全部内容,希望文章能够帮你解决Go1.9安全的限制net.Listener接入连接数所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(62)

评论列表共有 0 条评论

立即
投稿
返回
顶部