无法连接到TCP服务器超过140个连接?

时间:2017-02-15 18:41:23

标签: macos sockets go tcp

我正在golang中构建一个tcp套接字服务器。它适用于少于约140个客户端连接。但是,如果我尝试将最大连接数设置为500,则在第140个客户端未连接到服务器之后。

我将文件描述符数量增加到1048576,但它仍然不起作用。

$ulimit -n
1048576

我认为问题来自操作系统。(服务器和客户端在同一台机器上工作)所​​以操作系统信息:

  

Mac OS 10.12 Sierra 64位。

有谁知道为什么我不能增加tcp连接数?

github

2 个答案:

答案 0 :(得分:0)

我和你在同一个操作系统上,但我无法重现你的问题。我使用Go版本1.7.4。我没有在Go 1.8上测试过,但它今天早些时候发布了。

我创建了两个文件,server.go和client.go(转载如下)。当我运行它们时,我得到超过140个连接。在运行之前,我切换到root并设置了ulimit,如下所示:

$ sudo -s
$ ulimit -n 10000

客户输出:

Established 1 connections
...
Established 2971 connections
panic: dial tcp 127.0.0.1:1337: socket: too many open files in system

服务器输出非常相似的内容。

这是client.go:

package main

import (
    "fmt"
    "net"
)

func main() {
    var numConns int
    for {
        _, err := net.Dial("tcp", "127.0.0.1:1337")
        if err != nil {
            panic(err)
        }
        numConns++
        fmt.Println("Established", numConns, "connections")
    }
}

和server.go:

package main

import (
    "fmt"
    "net"
)

func main() {
    listener, err := net.Listen("tcp", ":1337")
    if err != nil {
        panic(err)
    }
    var numConns int
    for {
        _, err := listener.Accept()
        if err != nil {
            panic(err)
        }
        numConns++
        fmt.Println("Got", numConns, "connections")
    }
}

答案 1 :(得分:0)

这不是操作系统的问题,而是硬件问题。这可能是您的路由器出了问题。当你进入这个范围时,商业路由器往往会失败。我的猜测是Alex正在一家大公司或大学进行测试,他们有商用级路由器,但你在家里进行测试。