問題タブ [io-completion-ports]
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# - c# 並列 IO 完了ポート
いくつかの I/O Completion ポートが完了するのを待つ最善の方法を見つけようとしています。
このシナリオでは、MVC3 Web アプリを使用しているとしましょう。(私の理解では、ここで I/O Completion ポートを使用することをお勧めします。これにより、元のスレッドを IIS に戻して他の要求にサービスを提供できます)
ID の配列があり、ネットワーク呼び出しから各 ID のオブジェクトを取得したいとします。
この同期メソッドを並列化する最良の方法は何ですか?
私はそれが次のように始まることを知っています:
DataServiceContext.BeginExecuteメソッド を使用する必要がありますか? DataServiceContext.BeginExecuteBatch ? 私が使用しているデータ サービスは、一度に 1 つのレコードしか取得できません (これは私の制御を超えています)。これらの個々のクエリを並行して実行したいと考えています。
winapi - BindIoCompletionCallbackを使用してWinSockTCPタイムアウトを検出する方法
BindIoCompletionCallbackを使用してVisualC++ WinSock TCPサーバーを構築しています。データの送受信は正常に機能しますが、タイムアウトを検出する適切な方法が見つかりません。ピアがブロックされていない場合、SetSockOpt / SO_RCVTIMEO/SO_SNDTIMEOは非ブロッキングソケットに影響を与えません。データを送信すると、CompletionRoutineはまったく呼び出されません。
OVERLAPPEDのhEventフィールドでRegisterWaitForSingleObjectを使用することを考えていますが、これは機能する可能性がありますが、CompletionRoutineはまったく必要ありません。まだIOCPを使用していますか?RegisterWaitForSingleObjectのみを使用し、BindIoCompletionCallbackを使用しない場合、パフォーマンスの問題はありますか?
更新:コードサンプル:
私の最初の試み:
私が言ったように、クライアントが実際に私にデータを送信している場合は正常に機能します、「受信」はブロックされていません、CompletionRoutineが呼び出され、データが受信されましたが、クライアントが私にデータを送信していない場合、どうすればよいですか?タイムアウト後にあきらめますか?
SetSockOpt / SO_RCVTIMEO / SO_SNDTIMEOはここでは役に立たないので、IOが完了したときに通知されるOVERLAPPED構造のhEventフィールドを使用する必要があると思いますが、その上のWaitForSingleObject / WSAWaitForMultipleEventsはReceive呼び出しをブロックし、Receiveを常にすぐに戻るので、RegisterWaitForSingleObjectとWAITORTIMERCALLBACKを使用しました。動作し、タイムアウト後にコールバックが呼び出されたか、IOが完了しましたが、単一のIO操作に対して2つのコールバック、CompletionRoutineとWaitOrTimerCallbackがあります。
IOが完了した場合、それらは同時に呼び出されます。IOが完了していない場合、WaitOrTimerCallbackが呼び出され、次にCancelIoExを呼び出します。これにより、CompletionRoutineが何らかのABORTEDエラーで呼び出されましたが、競合状態、おそらくIOです。キャンセルする直前に完了します。それから...何とか、全体として非常に複雑です。
次に、実際にはBindIoCompletionCallbackとCompletionRoutineはまったく必要ないことに気付き、WaitOrTimerCallbackからすべてを実行すると、機能する可能性がありますが、ここで興味深い質問があります。そもそもIOCPベースのWinsockサーバーを構築したかったので、BindIoCompletionCallbackはこれを行う最も簡単な方法は、Windows自体が提供するスレッドプールを使用して、IOCPコードがまったくないサーバーになってしまうのでしょうか。それはまだIOCPですか?または、BindIoCompletionCallbackを忘れて、独自のIOCPスレッドプール実装を構築する必要がありますか?なぜ ?
windows - CloseHandle()は、シリアルポートが実際に閉じられる前に戻ります
シリアルポートが閉じ終わったときを把握しようとして髪を引っ張っているので、再び開くことができます。CloseHandle()
ポートが実際にロック解除される前に戻ることが判明しました。
を使用してシリアルポートを開き、を使用CreateFile(FILE_FLAG_OVERLAPPED)
してCompletionPortに関連付け、を使用してCreateIoCompletionPort()
読み取り/書き込みを行い、を使用しReadFile()
てWriteFile()
閉じていCloseHandle()
ます。
シリアルポートをすばやく閉じて再度開くと、ERROR_ACCESS_DENIED
から戻ってくることに気づきましたCreateFile()
。CloseHandle()
これは、戻るのを待ってから、そのハンドルに関連付けられているすべての未処理の読み取り/書き込み操作が完了ポートから戻るのを待っているにもかかわらず発生しています。確かにもっと良い方法があります:)
シリアルポートを同期的に閉じるにはどうすればよいですか?ループ、sleep()、またはその他の安価なハックを再試行しないでください。
編集:多分これは私の完了ポートとFILE_FLAG_OVERLAPPEDの使用と関係があります。読み取り/書き込み操作が完了すると、コールバックが返されます。ポートを閉じるための何らかのコールバックはありますか?
c++ - WSARecv、Completionportモデル、バッファを管理してオーバーランを回避する方法は?
私の問題:私のCompletionportサーバーは、さまざまなクライアントから不明なサイズのデータを受信します。問題は、バッファオーバーランを回避する方法/(受信)バッファがデータで「いっぱいになる」のを回避する方法がわからないということです。
ここでQuesitonsに:1)WSARecvを介して受信呼び出しを行う場合、workerthreadはコールバック関数のように機能しますか?つまり、受信コールが完了したときにのみそれを掘り起こしますか、それとも受信が行われているときにもそれを掘り起こしますか?lpNumberOfBytes(GetQueuedCompletionStatusから)変数には、これまでに受信したバイト数または受信した合計バイト数が含まれていますか?
2)オーバーランを回避する方法、動的に割り当てられたバッファー構造を考えましたが、パッケージがどれだけ大きくなるかを知るにはどうすればよいですか?
編集:私はこれを尋ねるのは嫌いですが、バッファを管理し、オーバーランを回避するための「簡単な」方法はありますか?少なくとも今のところ、同期は私には立ち入り禁止に聞こえます
c - IO完了ポートの問題があるWriteFile
基本的に、IO完了ポートを使用してファイルに5回書き込むこのコードがあります。ご想像のとおり、うまく機能しません。問題は、「hello」がファイルに5回書き込まれることを期待していますが、常に1つの「hello」のみを書き込むことになります。プログラムが「5バイトを書き込んだ」を5回出力するので混乱しているので、書き込みは正常に完了していると思います。
誰かがこれに関する問題を見ることができますか?
c# - SocketAsyncEventArgs バッファーがゼロでいっぱいです
分散システム用のメッセージ レイヤーを作成しています。IOCP、つまり Socket.XXXAsync メソッドを使用しています。
これは私がやっていることにかなり近いものです (実際、私の受信機能は彼に基づいています): http://vadmyst.blogspot.com/2008/05/sample-code-for-tcp-server-using.html
私が今見つけたのは、プログラムの開始時 (2 つのテスト サーバーが互いに通信している場合) に、.Buffer が完全にゼロで埋められている SAEA オブジェクトを毎回取得することですが、.BytesTransferred のサイズはバッファ(私の場合は1024)。
これは何を意味するのでしょうか?チェックする必要がある特別な条件はありますか? 私のシステムはこれを不完全なメッセージと解釈して先に進みますが、実際にデータが欠落しているのではないかと考えています。何も受信されていない場合は、コールバックが得られないという印象を受けました。いずれにせよ、WireShark を見ると、ゼロ長のパケットが入ってくることはありません。
Google で検索したときに次の情報を見つけましたが、問題が同じかどうかはわかりません: http://social.msdn.microsoft.com/Forums/en-US/ncl/thread/40fe397c-b1da-428e -a355-ee5a6b0b4d2c
http://go4answers.webhost4life.com/Example/socketasynceventargs-buffer-not-ready-121918.aspx
c# - ファイルストリームの順序を維持しながら、複数のファイルを同じio完了ポートに関連付けますc#
別のプロセスから送信されたオブジェクトを、ディスク上のいくつかのファイルに書き込む必要があります。各オブジェクトには、fileID(書き込まれるファイルの名前)とデータのチャンクが付属しています。
同時非同期I/Oを使用して、ファイルの書き込みを最適化するためにIO完了ポート(IOCP)を使用したいのですが、各ファイルを同期的に書き込む必要があります。たとえば、書き込み時にファイルごとのチャンク順序を維持する必要があります。ディスクはありますが、ファイルの順序はありません。
.NetがIO操作を実行するたびにIOCPを使用することを理解していますが、どうすれば希望どおりに動作させることができますか?
c++ - IO 完了ポート - 送信または受信?
非ブロッキング ソケットを使用して多重化する IO Completion Ports を使用するプログラムを作成した場合、getQueuedCompletionStatus が返されたときに、ソケットで実行された関数が send または recv のどちらであったかをどのように知ることができますか?
前もって感謝します :)
c# - C# の限られたスレッドプールで複数のソケットから IO 完了ポートを使用する
さまざまな着信ポート (~20) からの UDP パケットをリッスンしようとしています。これらのパケットの受信と処理に 3 ~ 5 個のスレッドを割り当てたいと考えています。これは、Windows の IO 完了ポートにとって理想的な状況のようです。私が理解していないのは、複数のソケットの多対少数のマッピングを実行して、より小さなスレッドセットをチェックする方法です。
次のコードは、すべてのソケットを作成し、非同期受信操作を開始します。
パケットが受信されると、各 OnReceive Message が呼び出されることを理解しています...
- OnReceive イベントを実行するスレッドの数を制限するにはどうすればよいですか?
- OnReceive メソッドが再帰的に何度も自分自身を呼び出すというまれなケースで、スタック オーバーフローを防ぐ最善の方法は何ですか?
c++ - I/O完了ポート上の複数のスレッド
I/O完了ポートを使用してC++ソケットサーバーで作業しています。重複するI/Oアクティビティを処理するために一部の記事で推奨されているように、プロセッサごとに1つのI/Oポートと2つのワーカースレッドを作成します。
私が読んだことから、これらのワーカースレッドの1つだけが、いつでもウェイクアップしてI/O要求を処理しているはずです。したがって、1つのクライアントが接続(のみ)して何かを送信するときに期待するのは、ウェイクアップしてその受信を処理するスレッドが1つだけですが、デバッグしようとすると、複数のスレッドがウェイクアップして同じ操作を処理しようとすることがわかります。
私の仮定は間違っていますか?