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

时间:2014-10-13 17:29:23

标签: 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 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()
    }()
    ...
    ...
}

1 个答案:

答案 0 :(得分:0)

实际上,这可能是您未与我们分享的代码中的问题(那些......)

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

请检查文档http://golang.org/pkg/net/#IPConn.SetReadDeadline中使用的SetReadDeadline/SetWriteDeadline或本回答中使用的https://stackoverflow.com/a/12741495/93767

修复处理程序部分后,您可以使用客户端计数而不会出现任何问题。