我得到了使用一些舊代碼:非阻塞插座,選擇超時,讀(2)和寫(2)。 現在它偶爾因選擇/ 1024 fd限制而失敗。所以我需要更換選擇。如何檢查非阻塞套接字超時無選擇
RCVTIMEO和SNDTIMEO似乎也可以檢查超時但它們適用於阻塞模式,並且它對從非阻塞變爲阻塞影響過大。
那麼,有沒有其他的檢查超時非阻塞插座(無選擇)的最佳實踐?或者我必須得到一些計時器/納秒睡眠來解決這個問題?
我得到了使用一些舊代碼:非阻塞插座,選擇超時,讀(2)和寫(2)。 現在它偶爾因選擇/ 1024 fd限制而失敗。所以我需要更換選擇。如何檢查非阻塞套接字超時無選擇
RCVTIMEO和SNDTIMEO似乎也可以檢查超時但它們適用於阻塞模式,並且它對從非阻塞變爲阻塞影響過大。
那麼,有沒有其他的檢查超時非阻塞插座(無選擇)的最佳實踐?或者我必須得到一些計時器/納秒睡眠來解決這個問題?
poll()
本質上是使用select()
的直接替換,但沒有1024個文件描述符限制。您將不得不稍微更改代碼以創建struct pollfd
結構的數組,而不是使用fd_set
s,但代碼的整體結構不應更改。
它似乎我只是忘了有一個民意調查...「不要改變整體代碼結構」正是我想要的。有時你只需要儘快修復一些東西...... – xgwang
poll()系統調用將會超時並且沒有固定的文件描述符限制。如果你真的有1000個開放的描述符,你可能會更好地使用epoll(),它使用起來更復雜,但具有更好的縮放特性。
原來的** select **實際上是在讀取/寫入期間接收到** EAGAIN **或** EWOULDBLOCK **時檢查非阻塞套接字狀態。我在這裏沒有經驗,我認爲使用epoll來檢查循環讀/寫時的EAGAIN **是有點浪費,因爲它可能只監視一個套接字。 – xgwang
要從ciphor回答,請查看http://linux.die.net/man/7/epoll –
值得一提的是,您的操作系統也有一個文件描述符限制,它可能設置爲1024.我也推薦類似'libev'的東西。 –
@JoachimPileborg查看我對安迪羅斯的評論 – xgwang