初めて$ SUBを使用しており、この問題が発生しました。クライアントとサーバーの両方が重複した操作を使用していますが、ここでは問題があります。メッセージの名前付きパイプERROR_MORE_DATAとCancelIoExが重複しています
クライアント
C1。サーバーに接続します。
C2。パイプバッファよりも大きいメッセージを送信し、バッファをオーバーラップしてサーバーに渡します。
C3。送信操作を正常にキャンセルします。
サーバー
S1。クライアントを作成して待機します。
S2。クライアントが接続されると、メッセージが読み取られます。
S21。メッセージはバッファに収まらないので(ERROR_MORE_DATA)、部分的に読み込まれます。
メッセージ全体がいつ孤立した単位としてキャンセルされたかはわかりません。特に、クライアントが送信操作をキャンセルした場合、サーバーはメッセージ全体、その一部のみを受信し、結果としての読み取り操作はERROR_IO_PENDING(私の場合は)で返されます。キューに入れられました。私は、メッセージが取り消されていることを読者に伝える何らかの手段があると予想し、読者がそれに対応できるようにします。
しかし、関連するドキュメントはMSDN上に散在しているので、何か不足している可能性があります。誰かがそれに光を当てることができるなら、私は本当に感謝します。ありがとう。
私のクライアント(パイプライター)には、パイプを介してメッセージを送信する以外にも、他のものを処理するイベントループがあります。パイプ送信が非同期である理由は、サーバー(リーダー)がメッセージを処理するのに問題があり、バッファがいっぱいになった場合、クライアントは永遠にブロックしません。送信操作が非同期の場合、オーバーラップしたイベントハンドルがWaitForMultibleObjects呼び出しに追加されます。 –
パイプを閉じることを提案してくれてありがとう。それは私が今やっていることであり、私の状況のために働く。 –
@PeterVrabelあなたは 'MsgWaitForMultipleObject'と' CoWaitForMultipleHandles'を見たことがありますか?彼らはあなたもユーザー入力などの他のメッセージで目を覚ますことができます。これは、あなたがIOをキャンセルする必要があるより長い時間待つことを可能にするかもしれません。 – Ben