J'ai une simple prise d'écoute, qui arrête d'accepter le socket, en retenant EN_FILE
après seulement les connexions . J'ai essayé d'utiliser sysctl de la manière suivante:Les connexions max du socket d'écoute sont atteintes rapidement, tout en augmentant la limite.
$ 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
Mais cela ne semble pas résoudre le problème, un redémarrage est nécessaire spécifiquement sur OSX? J'ai besoin pour un test singulier, donc je ne prévoyais pas le rendre permanent dans /etc/sysctl.conf
création Socket:
#if os(Linux)
fileDescriptor = Glibc.socket(AF_INET, Int32(SOCK_STREAM.rawValue), 0)
#else
fileDescriptor = Darwin.socket(AF_INET, SOCK_STREAM, 0)
#endif
Et la partie accepter:
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
}
Remarques
libtls (LibreSSL 2.5.5) est utilisé après accept().
EN_FILE est la valeur retournée, où je pense personnellement EM_FILE
Merci! appris quelque chose encore aujourd'hui, l'essayera bientôt et acceptera votre réponse. Je pensais que le descripteur serait négatif ainsi que les valeurs d'erreur. –