問題タブ [iocp]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - GetQueuedCompletionStatus を使用してタイムリーに返されない WSASend を使用する OVERLAPS がありますか?
背景: CreateIoCompletionPort、WSASend/Recv、および GetQueuedCompletionStatus を使用して、サーバーでオーバーラップ ソケット io を実行しています。フロー制御については、クライアントに送信するときに、保留中のすべての OVERLAP が IOCP からポップされたときにのみ、複数の WSASend() の呼び出しを許可します。
問題: 最近、OVERLAP が IOCP に返されない場合があります。GetQueuedCompletionStatus を呼び出すスレッドはそれらを取得せず、ローカルの保留キューに残ります。クライアントがソケットからデータを受信し、ソケットが接続されていることを確認しました。WSASend() 呼び出しが行われたときに、エラーは返されませんでした。OVERLAP は、次のような外部刺激がなければ、単に「決して」元に戻ることはありません。
- クライアントまたはサーバーからソケットを切断すると、すぐに GetQueuedCompletionStatus スレッドが OVERLAP を取得できるようになります。
- すべての OVERLAP が突然キューから取り出される前に、WSASend() を追加で呼び出す必要があります。
質問: この種の行動を見た人はいますか? これを引き起こしている原因についてのアイデアはありますか?
ありがとう、ジェフリー
c# - IOCP での SslStream の使用
Socket クラスの非同期/IOCP メソッド、BeginSend()/BeginRead()/etc を使用して TCP サーバーを作成しました。SslStream を使用して SSL 機能を追加したいのですが、インターフェイスからは、特に Streams をまったく使用しておらず、SslStream が動作する Stream に依存しているように見えるため、Socket と SslStream は連携することを意図していないように見えます.
これは可能ですか、それとも間違った場所を探していますか? Socket インスタンスにフィードする独自の Stream サブクラスを作成し、それを SslStream に指定する必要がありますか? スケーリングの問題から、サーバーで IOCP を使用することが重要です。
c++ - I/O完了ポートを使用した非同期操作は0バイトを転送して返します
I / O完了ポートを使用した非同期操作は、転送された0バイトを返しますが、I / O操作は期待どおりに機能します(読み取りバッファーがいっぱいになります)。
作業スレッド:
どちらの関数もnumBytesで0バイトを返しますが、いっぱいになっていbuffer
ます。これは予想される動作ですか?
ありがとう。
c++ - IO完了ポート:WSARecv()はどのように機能しますか?
ワーカースレッドのプールとIO完了ポートを使用してサーバーを作成したいと思います。サーバーは、複数のクライアント間でメッセージを処理および転送する必要があります。'クライアントごとの'データはクラスClientContextにあります。このクラスのインスタンス間のデータは、ワーカースレッドを使用して交換されます。これは典型的なシナリオだと思います。
ただし、これらのIO完了ポートには2つの問題があります。
(1)最初の問題は、サーバーが基本的にクライアントからデータを受信することですが、完全なメッセージが受信されたかどうかはわかりません。実際、WSAGetLastError()は、常にWSARecv()がまだ保留中であることを返します。WaitForMultipleObjects()を使用してイベントOVERLAPPED.hEventを待機しようとしました。ただし、それは永久にブロックされます。つまり、私のプログラムではWSARecv()が完了しません。私の目標は、さらに処理を開始する前に、メッセージ全体が受信されたことを絶対に確認することです。私のメッセージのヘッダーには「メッセージの長さ」フィールドがありますが、IOCP関数パラメーターでメッセージを使用する方法がわかりません。
(2)以下のコードスニペットでWSARecv()がコメントアウトされている場合でも、プログラムはデータを受信します。どういう意味ですか?WSARecv()を呼び出す必要がまったくないということですか?これらのIO完了ポートで決定論的な動作を得ることができません。ご協力いただきありがとうございます!
.net - .NET のワーカー スレッドと I/O スレッドの簡単な説明
.NET のワーカー スレッドと I/O スレッドの詳細でありながら単純な説明を見つけるのは非常に困難です。
このトピックに関して私に明らかなこと(ただし、技術的に正確ではないかもしれません):
- ワーカー スレッドは、作業に CPU を使用するスレッドです。
- I/O スレッド (「完了ポート スレッド」とも呼ばれる)は、デバイス ドライバーを使用して作業し、基本的に「何もしない」必要があり、CPU 以外の操作の完了のみを監視する必要があります。
不明な点:
- メソッド ThreadPool.GetAvailableThreads は両方のタイプの使用可能なスレッドの数を返しますが、I/O スレッドの作業をスケジュールするパブリック API はないようです。.NET でワーカー スレッドを手動でのみ作成できますか?
- 単一の I/O スレッドで複数の I/O 操作を監視できるようです。本当ですか?もしそうなら、ThreadPool がデフォルトで利用可能な I/O スレッドを非常に多く持っているのはなぜですか?
- 一部のテキストでは、I/O スレッドによって I/O 操作の完了が実行された後にトリガーされるコールバックを読みました。本当ですか?このコールバックが CPU 操作であることを考えると、これはワーカー スレッドのジョブではないでしょうか。
- より具体的に言えば、ASP.NET 非同期ページは I/O スレッドを使用しますか? ワーカー スレッドの最大数を増やすのではなく、I/O 作業を別のスレッドに切り替えることで、パフォーマンス上の利点は何ですか? 単一の I/O スレッドが複数の操作を監視しているためですか? または、I/O スレッドを使用すると、Windows はより効率的なコンテキスト切り替えを行いますか?
delphi - Delphi 用の I/O 完了ポート ベースのコンポーネントはありますか?
Indy、ICS、Synapse、およびClever InetSuiteを認識していますが、いずれもIOCPをサポートしていません。他に何かありますか?
編集: iocpclassesを見つけました。これは Delphi5で書かれています。何もないよりはましだと思います。
winapi - Reactorスタイルの操作でIOCP(または他のAPI)を使用することは可能ですか?
ソケットでreactorスタイルの操作を提供するスケーラブルなWin32API(selectではなくIOCPなど)はありますか?AFAIK IOCPを使用すると、データの読み取りや書き込み(プロクター)などの完了した操作に関する通知を受け取ることができますが、リアクタースタイルの操作を探しています。ソケットが読み取り可能または書き込み可能(リアクター)になったときに通知を受け取る必要があります。
epoll、kqueue 、/dev/poll
?
Win32にそのようなAPIはありますか?もしそうなら、どこでマニュアルを見つけることができますか?
**明確化:** select
IOCPと同じくらいスケーラブルなソケット用のAPIのようなものが必要です。または、reactorのような操作でIOCPを使用する方法を探しています。
さらに明確にする: IOCPを使用すると、特定の操作の完了時に通知を受け取ることができます。例えば:
だから私は操作が行われた後に通知を受け取ります-操作の監督者スタイル。
私が必要としているのはそのようなものです:
これどうやってするの?
c++ - C++ Windows IOCP - HTTP POST データがありません
私は非常に単純な IOCP HTTP サーバーを作成しました。これは GET 動詞では機能しますが、POST では機能しません。
ソケットと、accept() が接続を待機するリッスン スレッドを作成します。クライアントが接続したら、ioctlsocket() を呼び出してソケットのブロックを解除し、ソケットを IOCP に関連付け、最後に WSARecv() を呼び出してデータを読み取ります。
一部のデータが実際に読み取られ、それが発生すると、IOCP は GetQueuedCompletionStatus() を介してワーカー スレッドを起動し、要求データを回復します。
任意のブラウザーから POST するときにのみ、要求ヘッダーを取得します。理由について何か提案はありますか?
linux - Linux と I/O 完了ポート?
winsock を使用すると、ソケットを構成したり、I/O 操作を「オーバーラップ」するように分離したりできます。つまり、I/O を実行するための呼び出しはすぐに返されますが、実際の操作は個別のワーカー スレッドによって非同期に完了します。
Winsock は「完了ポート」も提供します。私が理解していることから、完了ポートはハンドル (ソケット) のマルチプレクサとして機能します。ハンドルが I/O 操作の途中でない場合、つまりすべての I/O 操作が完了している場合、ハンドルを逆多重化できます。
それで、私の質問に... Linux はソケットの完了ポートまたは非同期 I/O をサポートしていますか?