2017-08-02 72 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,然後檢查errnoEMFILEENFILE

+0

謝謝!今天又學到了一些東西,很快就會嘗試並接受你的回答。我認爲描述符和錯誤值都是負值。 –