在我的軟件在Windows和Linux下運行的過程中,我不得不重寫套接字層。在Windows上,我從select更改爲WSAPoll,並在包含標準事件以在必要時超時之前取消操作之前使用WSAWaitForMultipleEvents。由於我必須處理超過1024個輸入和輸出套接字,因此我必須將select從select變爲poll。有沒有什麼辦法可以取消在Linux下等待輪詢。我必須添加remoe連接,這將由輪詢的等待超時而減慢。取消套接字輪詢操作
回答
創建使用pipe()
僞內部事件和該讀取端添加到列表poll()
,使之成爲第一個事件。
當您想要取消輪詢時,向管道寫入字符並返回poll()
。你會知道這是一個內部事件,因爲它會有索引0.
你甚至可以通過向管道傳遞不同的值來使這個粗略的消息傳遞系統。
您可以使用手動事件對您的Windows代碼執行相同的操作。
查看此IoEvent
類就是這樣做的。
我之前讀過,無法相信這是最佳實踐方式。我想我應該從管道讀取值以避免在大型「事件」緩衝區中運行。你手頭有樣品還是鏈接? –
@MartinSchlott我從來沒有遇到過這種方法的問題,我認爲它很優雅,不依賴於強行停止系統調用。這也意味着你可以在'poll()'開始之前設置事件。上面鏈接的代碼應提供各種示例,但它們使用'IoEvent'和'IoEventWaiter'類,這些類可能會抽象概念太多。 – trojanfoe
呃,我先閱讀了你文章的最後一行。 Thx的鏈接! –
- 1. 取消異步套接字操作
- 2. Android - 套接字和輪詢
- 3. 套接字輪詢(selectwrite輪詢模式)何時變爲false?
- 4. 帶輪詢的非阻塞套接字
- 5. 測試C++輪詢套接字函數
- 6. Linux套接字操作
- 7. 連接:在非套接字上的套接字操作
- 8. UNIX套接字錯誤:在非套接字上的套接字操作
- 9. 在非套接字上的套接字操作
- 10. 用XHR輪詢關閉套接字連接
- 11. 套接字連接超時在c使用輪詢
- 12. Symbian:如何正確取消長時間的異步套接字操作
- 13. 獲取套接字讀取操作的進度
- 14. 套接字操作遇到死網
- 15. 終止套接字操作Windows Phone
- 16. 如何取消鏈接操作?
- 17. 套接字超時和取消
- 18. SwingWorker取消操作
- 19. 取消backgroundworker操作
- 20. AS3套接字讀取套接字作爲字節數組
- 21. 不輪詢讀取多個UDP消息
- 22. 獲得操作超時異常的套接字讀取
- 23. Python SSL套接字錯誤:ssl.SSLWantReadError:操作未完成(讀取)
- 24. 取消讀取操作
- 25. 輪詢,網絡套接字或彗星上的應用程序
- 26. 使用輪詢的套接字響應超時
- 27. udp在C++中輪詢套接字和多播
- 28. C++套接字永遠不會寫輪詢
- 29. 結合多個req套接字和pub的zeromq輪詢器
- 30. java中的套接字和stdin之間的輪詢
在旁註中,'boost :: asio'不夠好? – Nim
@Nim由於幾個原因,我停止在我的項目中使用boost。這裏只有兩個。官方文件是一個笑話。重要的行爲沒有解釋。在1.52中,boost :: asio有一個已知的錯誤,如果主機端口沒有打開(主機拒絕),連接和立即關閉事件被觸發,而沒有機會將其與正確的連接套接字區分開來。我轉向C++ 11,並試圖留下整個提升的東西,特別是boost :: asio。 –