2012-06-29 83 views
1

我得到了使用一些舊代碼:非阻塞插座,選擇超時,(2)和(2)。 現在它偶爾因選擇/ 1024 fd限制而失敗。所以我需要更換選擇。如何檢查非阻塞套接字超時無選擇

RCVTIMEO和SNDTIMEO似乎也可以檢查超時但它們適用於阻塞模式,並且它對從非阻塞變爲阻塞影響過大。

那麼,有沒有其他的檢查超時非阻塞插座(無選擇)的最佳實踐?或者我必須得到一些計時器/納秒睡眠來解決這個問題?

+1

要從ciphor回答,請查看http://linux.die.net/man/7/epoll –

+0

值得一提的是,您的操作系統也有一個文件描述符限制,它可能設置爲1024.我也推薦類似'libev'的東西。 –

+0

@JoachimPileborg查看我對安迪羅斯的評論 – xgwang

回答

4

poll()本質上是使用select()的直接替換,但沒有1024個文件描述符限制。您將不得不稍微更改代碼以創建struct pollfd結構的數組,而不是使用fd_set s,但代碼的整體結構不應更改。

+0

它似乎我只是忘了有一個民意調查...「不要改變整體代碼結構」正是我想要的。有時你只需要儘快修復一些東西...... – xgwang

2

poll()系統調用將會超時並且沒有固定的文件描述符限制。如果你真的有1000個開放的描述符,你可能會更好地使用epoll(),它使用起來更復雜,但具有更好的縮放特性。

+0

原來的** select **實際上是在讀取/寫入期間接收到** EAGAIN **或** EWOULDBLOCK **時檢查非阻塞套接字狀態。我在這裏沒有經驗,我認爲使用epoll來檢查循環讀/寫時的EAGAIN **是有點浪費,因爲它可能只監視一個套接字。 – xgwang

3

epoll是比select更好的解決方案,它不限於1024個描述符。

實際上,您可以使用libeventlibev來處理低級異步套接字I/O,它們是異步I/O的所謂「最佳實踐」。

+0

好吧,我只是維護這些代碼,並沒有太多的選擇。希望我有機會在未來介紹這些最佳作品。 – xgwang