2012-12-19 86 views
3

我正在編寫一個跨平臺的庫,它模擬套接字行爲,在(App-> mylib->套接字)之間具有附加功能。是否有與eventfd相當的Windows?

我希望它是最透明的可能的程序員,所以元像select和poll必須用這個LIB相應的工作。

問題是,當數據變得可用(例如)在真實套接字中時,它將不得不經過大量處理,所以如果選擇指向真實套接字fd,應用程序將被阻塞很多時間。我希望select/poll只在數據準備好被使用時解鎖(在我的lib完成所有處理之後)。

所以,我碰到這個eventfd,讓我做的正是我想要的,即到manipule在給定的FD選擇/ poll的行爲。

因爲我對Linux環境更熟悉,所以我不知道什麼是eventfd的等效窗口。試圖尋找,但沒有運氣。

注意: 其他方法是使用與接口連接的另一個套接字,但似乎有這麼多的開銷。僅僅因爲Windows沒有(看起來如此)這個功能而使用所有數據進行系統調用。

或者我可以實現我自己的選擇,重新發明輪子。 =/

+1

Windows只在WinSock中提供'select',這意味着它只能在網絡套接字上運行,而不是在文件描述符上運行。 – 2012-12-19 18:48:52

回答

2

沒有。 eventfd是Linux特有的功能 - 甚至在其他UNIXy操作系統(如BSD和Mac OS X)上都沒有。

2

是的,但它很荒謬。您可以創建一個分層服務提供程序(全局安裝...),以便與系統的網絡堆棧一起擺弄。你可以自己實現所有的WinSock2函數,並將其大部分轉發到底層的TCP。這通常被防火牆或防病毒程序用來將自己插入堆棧並查看發生了什麼。

就你而言,你想要使用ioctl爲你的應用程序打開「特殊」行爲。每當應用程序嘗試創建套接字時,它都會被轉發到您的函數,然後打開一個真正的TCP套接字(比如說)。雖然不使用HANDLE,但使用WinSock函數從內核創建一個虛擬句柄,然後將其提供給應用程序。你在一個線程中做你的東西。然後,當應用程序在虛擬手柄上調用WinSock函數時,它們將最終落實到讀取,選擇等操作中。您可以將虛擬手柄上的選定通知與實際手柄上的通知分開。這可以讓你做一些事情,例如,透明地給應用程序提供一個套接字,以每種方式將數據封裝在加密中,與原始套接字無差別。 (幾乎沒有區別!你可以在句柄上調用一些LSP API來查看是否有實際的和底層的句柄,你沒有給出。)

相當重的,在某些方面怪異。但是,它在那裏......希望這是一個有用的概述。

+0

謝謝! 這似乎是Windows的完美選擇,但我擔心這種方法我幾乎不得不爲每個系統有一個完全不同的實現(糾正我,如果我錯了)。我認爲現在我會堅持使用AF_UNIX套接字,並在其他系統上使用本地主機上的TCP套接字(例如win)。 – Leaurus

+0

不錯的選擇。在可能的情況下儘量避開Windows的廢話。我認爲你的解決方案本質上是最佳的,因爲如果你堅持使用像select這樣的系統調用,你的lib必須交出一個實際的fd/socket。 –

相關問題