我正在努力將一些相對簡單的網絡代碼從unix移植到Windows。將多線程網絡服務器從unix移植到windows
簡而言之,有一個管理所有網絡流量的網絡線程。這個單線程大部分時間位於poll()
之內(我已經將它轉換爲select()
,在Windows上),網絡線程只有在有傳入的網絡數據時纔會喚醒。當客戶端命令到達時,網絡線程將該命令發送給工作線程,以便在後端實際執行工作,然後返回到偵聽更多傳入命令。命令是異步的 - 多個命令可以進入一個套接字,一個接一個接一個。在任何時候,在一個連接上可以有幾十個優秀的命令,所有這些命令都在各種工作線程中工作。
問題是,當工作線程想要發送響應數據時,網絡線程可能在工作線程嘗試發送結果時在poll()
內部睡着。網絡線程必須等待poll()
超時(或接收另一個數據包),纔會發現有新的出站數據排隊等待發送。
在unix下,我通過在poll()
正在監視的描述符中包含一個管道來處理這個問題,並且當一個工作線程有出站數據要發送時,它還將一個字節的數據寫入管道以喚醒網絡線程。但是WinSock似乎只支持在套接字上等待,所以這種方法在Windows中不適用於我。有沒有什麼方法可以讓我在Windows上使用WinSock搶救這個體系結構(這樣我可以在不同平臺之間共享大部分代碼),還是別無選擇,只能編寫自定義網絡服務器實現以用於Windows?
感謝您的諮詢!
是的,絕對正確。但在這種情況下,我正在使用爲BSD套接字編寫的現有代碼,並試圖儘量減少我爲Windows構建編寫和維護的自定義代碼的數量。如果性能實際上成爲問題並且在這部分代碼中進行性能分析,那麼切換到IOCP是我列表中的第一件事。在此之前,我可能不打擾。 :) –