2012-03-27 15 views
0

初めて$ SUBを使用しており、この問題が発生しました。クライアントとサーバーの両方が重複した操作を使用していますが、ここでは問題があります。メッセージの名前付きパイプERROR_MORE_DATAとCancelIoExが重複しています

クライアント

C1。サーバーに接続します。
C2。パイプバッファよりも大きいメッセージを送信し、バッファをオーバーラップしてサーバーに渡します。
C3。送信操作を正常にキャンセルします。

サーバー

S1。クライアントを作成して待機します。
S2。クライアントが接続されると、メッセージが読み取られます。
S21。メッセージはバッファに収まらないので(ERROR_MORE_DATA)、部分的に読み込まれます。

メッセージ全体がいつ孤立した単位としてキャンセルされたかはわかりません。特に、クライアントが送信操作をキャンセルした場合、サーバーはメッセージ全体、その一部のみを受信し、結果としての読み取り操作はERROR_IO_PENDING(私の場合は)で返されます。キューに入れられました。私は、メッセージが取り消されていることを読者に伝える何らかの手段があると予想し、読者がそれに対応できるようにします。

しかし、関連するドキュメントはMSDN上に散在しているので、何か不足している可能性があります。誰かがそれに光を当てることができるなら、私は本当に感謝します。ありがとう。

答えて

0

あなたは正しいと言えます。

途中でWritefileをキャンセルすると、メッセージの一部のみが書き込まれるため、その部分だけがサーバーによって読み取られます。あなたがそれをキャンセルする前にどれくらいの大きさのメッセージが送られてきたかについて送られた "簿記"情報はありません。送信されるのは生データです。

答えは次のとおりです。IOをキャンセルしないでください。成功するまで待ってください。

doを実行すると、途中でIOをキャンセルする必要があります。ネットワークの停止と同様に、接続を切断して最初からやり直すべきでしょう。

(あなたが実際に書き込まれたどのくらいのを見つけるためにあなたのOVERLAPPED構造を確認し、そこからのキャリーが、あなたはおそらく最初の場所でIOをキャンセルしないことをやってみたかった場合があります。)

なぜあなたはIOをキャンセルしたいのですか?どのような一連の状況がこの要件を引き起こしますか?

+0

私のクライアント(パイプライター)には、パイプを介してメッセージを送信する以外にも、他のものを処理するイベントループがあります。パイプ送信が非同期である理由は、サーバー(リーダー)がメッセージを処理するのに問題があり、バッファがいっぱいになった場合、クライアントは永遠にブロックしません。送信操作が非同期の場合、オーバーラップしたイベントハンドルがWaitForMultibleObjects呼び出しに追加されます。 –

+0

パイプを閉じることを提案してくれてありがとう。それは私が今やっていることであり、私の状況のた​​めに働く。 –

+0

@PeterVrabelあなたは 'MsgWaitForMultipleObject'と' CoWaitForMultipleHandles'を見たことがありますか?彼らはあなたもユーザー入力などの他のメッセージで目を覚ますことができます。これは、あなたがIOをキャンセルする必要があるより長い時間待つことを可能にするかもしれません。 – Ben

関連する問題