3

私は、ソケットの動作をエミュレートするクロスプラットフォーム ライブラリを作成しており、その間に追加機能があります (App->mylib->sockets)。

プログラマーにとって可能な限り透過的にしたいので、 select や poll などのプリミティブは、この lib に応じて機能する必要があります

問題は、データが実際のソケットで (たとえば) 利用可能になると、多くの処理を行う必要があるため、select が実際のソケット fd を指している場合、アプリは長時間ブロックされます。データが消費される準備ができた場合にのみ、選択/ポーリングのブロックを解除したい (私のライブラリがすべての処理を完了した後)。

だから私はこのeventfdに出くわしました。これにより、私がやりたいことを正確に行うことができます

私は Linux 環境に精通しているため、windows での eventfd に相当するものは何なのかわかりません。検索しようとしましたが、運がありませんでした。

注: 別の方法として、インターフェイスに接続された別のソケットを使用することもできますが、これはオーバーヘッドが大きいようです。Windowsにこの機能がない(そう見える)という理由だけで、すべてのデータでシステムコールを行う。

または、車輪を再発明して、独自の選択を実装することもできます。=/

4

2 に答える 2

2

はい、でもばかげています。システムのネットワークスタックをいじるレイヤードサービスプロバイダー(グローバルにインストールされます...)を作成できます。すべての WinSock2 関数を自分で実装し、それらのほとんどを基礎となる TCP に転送できます。これは、ファイアウォールやウイルス対策プログラムが自分自身をスタックに挿入し、何が起こっているかを確認するためによく使用されます。

あなたの場合、ioctl を使用して、アプリケーションの「特別な」動作をオンにする必要があります。アプリがソケットを作成しようとするたびに、関数に転送され、実際の TCP ソケットが開かれます (たとえば)。ただし、その HANDLE を返す代わりに、WinSock 関数を使用してカーネルからダミー ハンドルを要求し、代わりにそれをアプリケーションに渡します。あなたはスレッドで自分のことをします。次に、アプリがダミー ハンドルで WinSock 関数を呼び出すと、最終的に読み取り、選択などの実装になります。ダミー ハンドルの選択通知を実際のハンドルの選択通知から切り離すことができます。これにより、たとえば、元のソケットと見分けがつかないように、データを暗号化して各方法でラップするソケットをアプリに透過的に与えることができます。(ほとんど見分けがつきません!

かなり重量級で、ある意味怪物的。しかし、それはあります...役に立つ概要であることを願っています。

于 2012-12-19T20:48:45.003 に答える
2

なにもない。eventfdは Linux 固有の機能です。BSD や Mac OS X などの他の UNIX オペレーティング システムでは利用できません。

于 2012-12-19T18:50:15.633 に答える