Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 限制连接到网络服务的客户端数量_Sockets_Go - Fatal编程技术网

Sockets 限制连接到网络服务的客户端数量

Sockets 限制连接到网络服务的客户端数量,sockets,go,Sockets,Go,如何限制连接到我的服务的客户端数量? 我试着用一个简单的计数器,但是如果一个客户端没有关闭就退出了 他们的关系我不知道怎么搞的 有人能给我一些想法吗 const MAX_CLIENTS = 5 var ConnectedClients int func main() { ConnectedClients = 0 server, err := net.Listen(CONN_TYPE, net.JoinHostPort(CONN_HOST, CONN_PORT)) if e

如何限制连接到我的服务的客户端数量? 我试着用一个简单的计数器,但是如果一个客户端没有关闭就退出了 他们的关系我不知道怎么搞的

有人能给我一些想法吗

const MAX_CLIENTS = 5
var ConnectedClients int
func main() {
    ConnectedClients = 0
    server, err := net.Listen(CONN_TYPE, net.JoinHostPort(CONN_HOST, CONN_PORT))
    if err != nil {
        fmt.Println("Error Listening", err.Error())
        os.Exit(1)
    }
    defer server.Close()
    fmt.Println("Listening on ", net.JoinHostPort(CONN_HOST, CONN_PORT))
    for {
        conn, err := server.Accept()
        if err != nil {
            fmt.Println("Error acepting: ", err.Error())
            os.Exit(1)
        }

        ConnectedClients += 1
        fmt.Println("Connected with:", conn.RemoteAddr())
        fmt.Println("Clients:", ConnectedClients)

        if ConnectedClients > MAX_CLIENTS {
            fmt.Println("Limit reached! Disconnecting:", conn.RemoteAddr())
            conn.Close()
        }
        go handleRequest(conn)
    }
}

func handleRequest(conn net.Conn) {
    //This defer will never run.... :-(
    defer func() {
        fmt.Println("Connection closed with client:", conn.RemoteAddr())
        ConnectedClients -= 1
        conn.Close()
    }()
    ...
    ...
}

实际上,这可能是你没有与我们分享的代码中的问题

连接将退出-迟早。假设在连接处理程序中,您必须执行一些读/写操作,因此最好的方法是使用读/写超时期限来引发错误,您将根据需要处理这些错误

请检查文档中或本答案中使用的SetReadDeadline/SetWriteDeadline的用法-

一旦修复了处理程序部分,就可以使用客户端计数而不会出现任何问题