2017-08-02 3 views
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

答えて

1

期待する場合には、返される値です。それは意味をなさない。ファイル記述子とエラーコードはどちらも通常は小さい整数なので、結局は最終的に "マッチ"を得るでしょう。

clientFDを-1と比較し、errnoEMFILEまたはENFILEに対してチェックしたいとします。

+0

ありがとうございます!もう一度何かを学んだら、すぐにそれを試し、あなたの答えを受け入れるでしょう。私は、記述子がエラー値と同様に負であると考えました。 –

関連する問題