听力套接字最大连接提前命中,同时增加了限制

时间:2017-08-02 18:00:45

标签: swift macos sockets unix posix

我有一个简单的侦听套接字,它停止接受套接字,仅在 13 连接后退回EN_FILE。 我尝试过以下方式使用sysctl:

$ sysctl kern.maxfiles
kern.maxfiles: 12288
$ sysctl kern.maxfilesperproc
kern.maxfilesperproc: 10240
$ sudo sysctl -w kern.maxfiles=1048600
kern.maxfiles: 12288 -> 1048600
$ sudo sysctl -w kern.maxfilesperproc=1048576
kern.maxfilesperproc: 10240 -> 1048576
$ ulimit -S -n
256
$ ulimit -S -n 1048576
$ ulimit -S -n
1048576

但这似乎没有解决问题,是否需要在OSX上专门重启?我需要它进行单一测试,所以我不打算在/etc/sysctl.conf中将它永久化。

套接字创建:

 #if os(Linux)
            fileDescriptor = Glibc.socket(AF_INET, Int32(SOCK_STREAM.rawValue), 0)
        #else
            fileDescriptor = Darwin.socket(AF_INET, SOCK_STREAM, 0)
        #endif

接受部分:

let result = withUnsafePointer(to: &address) {
            $0.withMemoryRebound(to: sockaddr.self, capacity: 1) { sockAddress in
                // Do nothing
                bind(fileDescriptor, sockAddress, UInt32(MemoryLayout<sockaddr_in>.size))
            }
        }

let clientFD = accept(fileDescriptor, nil, nil)
        if( clientFD == EMFILE || clientFD == ENFILE ) {
            print("[\(type(of: self))] WARNING: Maximum number of open connections has been reached")
            close(clientFD)
            return nil
        }

备注

libtls(LibreSSL 2.5.5)在accept()之后使用。

EN_FILE是返回的值,我个人期望EM_FILE

1 个答案:

答案 0 :(得分:1)

您将接受的文件描述符与错误代码进行比较。这没有意义。由于文件描述符和错误代码通常都是小整数,因此您当然会得到一个&#34;匹配&#34;最终

您想要将clientFD与-1进行比较,然后针对errnoEMFILE检查ENFILE