1
私は単純なリスニングソケットを持っており、ソケット受け入れを中止します。の接続後に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
}
ノート
accept()の後にlibtls(LibreSSL 2.5.5)が使用されます。
EN_FILEは、あなたがエラーコードに対する受け入れられたファイルディスクリプタを比較している私は個人的にEM_FILE
ありがとうございます!もう一度何かを学んだら、すぐにそれを試し、あなたの答えを受け入れるでしょう。私は、記述子がエラー値と同様に負であると考えました。 –