2013-10-02 34 views
1

在我的軟件在Windows和Linux下運行的過程中,我不得不重寫套接字層。在Windows上,我從select更改爲WSAPoll,並在包含標準事件以在必要時超時之前取消操作之前使用WSAWaitForMultipleEvents。由於我必須處理超過1024個輸入和輸出套接字,因此我必須將select從select變爲poll。有沒有什麼辦法可以取消在Linux下等待輪詢。我必須添加remoe連接,這將由輪詢的等待超時而減慢。取消套接字輪詢操作

+0

在旁註中,'boost :: asio'不夠好? – Nim

+0

@Nim由於幾個原因,我停止在我的項目中使用boost。這裏只有兩個。官方文件是一個笑話。重要的行爲沒有解釋。在1.52中,boost :: asio有一個已知的錯誤,如果主機端口沒有打開(主機拒絕),連接和立即關閉事件被觸發,而沒有機會將其與正確的連接套接字區分開來。我轉向C++ 11,並試圖留下整個提升的東西,特別是boost :: asio。 –

回答

2

創建使用pipe()僞內部事件和該讀取端添加到列表poll(),使之成爲第一個事件。

當您想要取消輪詢時,向管道寫入字符並返回poll()。你會知道這是一個內部事件,因爲它會有索引0.

你甚至可以通過向管道傳遞不同的值來使這個粗略的消息傳遞系統。

您可以使用手動事件對您的Windows代碼執行相同的操作。

查看此IoEvent類就是這樣做的。

+0

我之前讀過,無法相信這是最佳實踐方式。我想我應該從管道讀取值以避免在大型「事件」緩衝區中運行。你手頭有樣品還是鏈接? –

+0

@MartinSchlott我從來沒有遇到過這種方法的問題,我認爲它很優雅,不依賴於強行停止系統調用。這也意味着你可以在'poll()'開始之前設置事件。上面鏈接的代碼應提供各種示例,但它們使用'IoEvent'和'IoEventWaiter'類,這些類可能會抽象概念太多。 – trojanfoe

+0

呃,我先閱讀了你文章的最後一行。 Thx的鏈接! –