問題タブ [overlapped-io]
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++ - ソケット recv() がファイルに書き込まれたときにデータが整列し、それから FILE_NO_BUFFERING_FLAG を指定した Overlapped_io を使用してファイルに書き込まれる
別のコンピューターからデータを受信し、そのデータを高スループット (GbEthernet から約 100MB/秒) で SSD RAID に書き込む C++ プログラムを作成しています。
overlapped_io
イーサネットから受信し、SSD に書き込みます。
受信が完了すると、ライターにメッセージが投稿されます。
そしてFILE_NO_BUFFERING_FLAG
、ディスク上にファイルを作成するときに使用します。
ネットワーク送信者側では、オーバーラップした IO を使用してデータを送信しています。
私は問題に行き詰まりました: ソケットから受け取ったとき、rv = recv()
はディスクと整列していません (おそらく 4096 回?)。
私は何をすべきか?
c++ - ReadFileEx、可変長 - いくつかの質問
stderr
子プロセスから読み込もうとしています。データは、 で作成されたテキスト行ですsprintf(stderr, "some debug info\n")
。ReadFileE
完了ルーチンで x を使用しています。テキストの行数や各行の長さはわかりません。nNumberOfBytesToRead
では、パラメータとして何を入力すればよいでしょうか。
私の推測では、バッファの最大サイズを入れて、4k にします。それが最適なサイズかどうかはわかりませんが。書き込まれた行stderr
が 4k より短い場合、完了ルーチンは起動しないと思います。4k に到達してもまだデータが残っている場合はReadFileEx
、完了ルーチン内で別のデータを起動する必要があると思います。GetLastError
が返されるため、これが事実であることがわかりますERROR_MORE_DATA
。バッファがいっぱいではなく、子プロセスが終了したときに呼び出しを受けることを望んでいます。stderr
子プロセスを作成したときに子プロセスに書き込みハンドルを渡したので、子プロセスが終了したときに完了コールバックを受け取るかどうかはわかりません。そのハンドルを閉じたときにコールバックを受け取るかもしれません。wrt
stderr
?
プロセスとハンドルの作成方法の疑似コードを次に示します。
詳細 (Tx 拡張機能は、エラーをスローするラッパーです):
c++ - WSARecv フック: 実行可能ファイルがパケットを受信しないようにします
C++ と回り道を使用して、winsock2 関数をフックする dll に取り組んでいます。私の目標は、元の実行可能ファイルとの間でやり取りされる TCP トラフィックを変更することです。ある時点で、特定のパケット配信を停止する必要があります (そのため、元の実行可能ファイルはそのパケットについてまったく認識しませんが、接続は維持されます)。
WSASend フックを使えば、それは明らかです (元の WSASend を呼び出して 0 を返さないだけです)。しかし、WSAOVERLAPPED 構造を使用して WSARecv フックで作成する方法がわかりません。
以下のこのコードが、私が何を望んでいるのかを示していることを願っています:
何も起こらず、パケットが受信されなかったふりをするにはどうすればよいですか (偽の WSA_IO_PENDING のように)。アイデア/考えはありますか?
PS私が知っていることから、実行可能ファイルは完了ルーチンを使用しておらず (lpCompletionRoutine は常に NULL)、構造が重複しているだけです。
windows - 別のスレッドで Windows が IO と IO をオーバーラップ
Windows では、I/O を行うときに、OVERLAPPED オプションを使用して非同期で行うことができます。それを行うことと、別のスレッドで同期的に I/O を実行することの間に違いはありますか? もしそうなら、どちらが良いですか?OS は非同期の場合に別のスレッドを生成するだけですか、それともドライバー スレッドでキューに入れ、ブロック待機の代わりにシグナルを送信するだけですか?
ありがとう!
windows - Cancel WaitCommEvent for overlapped serial I/O
シリアル ポート経由で非標準モデムを重複して処理しています。通信回線の読み書きの他に、関数を使ってCTSやDSRWaitCommEvent()
などの制御線をチェックする必要があります。
関数呼び出しが示す (事実上すべての) ケースでは、 が発生*background activity*
するのを待つ必要がありoverlapped.hEvent
ます。別のソース (ユーザー入力による IPC、プログラムの終了など) からのイベントも待っているので、WaitForMuiltipleObjects()
関数を使用します。しかし、制御ラインの変更以外の理由でブロッキング待機が終了した場合、バックグラウンド アクティビティを停止するにはどうすればよいEvtMask
ですか? 私が基にしているコードは現在 を使用SetCommMask(hFile, 0)
していますが、これが適切であるという信頼できる参照が見つかりませんでした。
また、制御ラインへの変更が適切にサポートされていないケース (ドライバー?、VM?) も観察しているため、その間にチェックを入れてスライス待機を行う必要があります。
EvtMask
変数が宣言されているスコープを安全に離れるために何をする必要がありますか?
c++ - bWait = false の GetOverlappedResults ブロック
GetOverlappedResults()はまったく戻りません。
以下の簡単な例を実行しました。ネットワーク インターフェイスで IP アドレスが変更されると、手動リセット イベントが設定され、「IP アドレス テーブルが変更されました..」という出力が表示されますが、bWait が false であっても GetOverlappedResults() は返されません。 . bWait = true の場合でも、イベントが設定されているため、I/O 操作が完了するため、返されるはずです。
何が起こっている?
c# - Win32 で FILE_FLAG_OVERLAPPED を使用して永久に保留中の COM ポート通信
ここでの最終的な目標は、既存の C++ アプリケーションが仮想シリアル COM ポートを介して既存の C# アプリケーションと通信できるようにすることです。どちらも他の誰かが作成したものです。私はシリアル通信にあまり詳しくありません。先週かそこらで勉強してきましたが、まだ頭を悩ませていますが、それでも仕事がなくなるわけではないので、ここにいます。ご協力いただける場合は、ELI5 までご連絡ください。
これを達成するという私の使命の中で、私の最近のアイデアは、単に既知のメッセージを送信し、期待されるメッセージを受信するだけの C++ アプリケーションをゼロから作成することでした。ファイル ハンドルを作成する C++ アプリケーションを作成し、 と を使用して COM 経由でメッセージを正常に送信することができましCreateFile(...)
たWriteFile(...)
。C# アプリケーションがメッセージを受信したことはわかっています。これは、受信したデータが正しく報告されているためです。ただし、C# アプリケーションから送り返されたデータが my によって受信されることはありませんReadFile(...)
。
次のステップは、メッセージを送信してリッスンするように C++ ミニアプリケーションをセットアップすることでした。これが機能することを発見したので、私の小さなアプリは COM 経由でメッセージを送受信できることがわかりました。しかし、C# アプリケーションは、どのバージョンの C++ アプリケーションにも届いたメッセージを送信できません。
C# アプリは FILE_FLAG_OVERLAPPED を使用しているのに対し、C++ アプリはすべて FILE_ATTRIBUTE_NORMAL を使用していると誰かが指摘しました。そこで、C++ アプリと C# アプリの一貫性を保つために、C++ アプリを微調整して FILE_FLAG_OVERLAPPED を使用するようにしました。ただし、これにより C++ アプリが失敗し、その理由がわかりません。助けを乞うのに十分長い間、それに立ち往生しています。エラー 997: ERROR_IO_PENDING で失敗し、メッセージを受信しないように見えるコードを次に示します (オーバーラップあり)。
送信者は、期待どおりにメッセージを送信したことを報告します。リスナーは単に「io pending」を永遠に無限に繰り返します。
したがって、いずれかの質問への回答が役立ちます。
- コードが失敗するのはなぜですか? FILE_FLAG_OVERLAPPED をどのように使用しますか?
- -また-
- 1 つのアプリが重複して送信/受信していて、もう 1 つのアプリが重複していないことは問題ですか?
- 実際に 3 番目の質問です。COM 通信が一方の方向では成功するのに、他方の方向では失敗する理由が他にありませんか?