2009-07-29 116 views
2

對於服務器端編程我用聽功能:編程評估SOMAXCONN的值,以設置監聽backlog參數

int listen(int sockfd, int backlog); 

據我所知,積壓應小於或等於設定的SOMAXCONN我將運行我的服務器程序的主機系統。 如果我使用SOMAXCONN作爲積壓,這將是等同於硬編碼到通常在tcp.h中定義爲128

然而SOMAXCONN的值,SOMAXCONN是可調諧的sysctl參數,即可以是通過更改/ proc/sys/net/core/somaxconn的值或通過使用sysctl修改net.core.somaxconn進行修改。人們通常會修改somaxconn以獲得更好的系統性能。 我希望我的程序能夠在程序啓動的時候評估系統的somaxconn。

我可以打開/ proc/sys/net/core/somaxconn文件並讀取包含的值,但這似乎是一種很不雅的做事方式,特別是因爲我認爲somaxconn的文件路徑可能會有所不同,具體取決於發行。

是否有API或示例代碼,允許在c/C++中評估somaxconn?

也告訴我,如果我錯過了一些關鍵點,導致思維有缺陷。

我也想將我的應用程序移植到Windows,所以Windows程序員也可能有一些有用的見解分享!

在此先感謝各位黑客。

+0

在windows上,它的記錄在這裏https://msdn.microsoft.com/en-us/library/windows/desktop/ms739168.aspx爲「如果設置爲SOMAXCONN,則負責socket s的基礎服務提供程序將設置積壓至最大合理價值,沒有標準條款來獲得實際積壓值「。所以使用這個特殊的價值,忘掉它。在windows SDK中,winsock2.h將SOMAXCONN定義爲0x7fffffff,這實際上是一個特殊值。不要通過其他任何東西 – 2016-01-09 09:30:25

回答

4

根據你的平臺,sysctl()與kern.ipc.somaxconn可能是你在找什麼。

但是,如果我正確理解您的問題,您的目標是始終使用最大可能的積壓大小。我的理解是,傳遞給listen()的積壓值將默默限於系統配置的限制。所以你的解決方案可以簡單地用「非常大的」積壓值調用listen()。

+0

然後即使是GOOGLE服務器,例如如果它們在Linux上運行,它們的backlog值是128? – codingfreak 2009-10-28 07:50:04