2017-11-02 9 views
0

読取りモードを同期入出力でPIPE_READMODE_MESSAGEに設定してパイプを読み取るときに、メッセージが完全に読み取られたかどうかを判断するのは非常に簡単です。 (戻りERROR_MORE_DATA)のReadFile関数はFALSEを返し、のGetLastError(場合は、メッセージが不完全であると、後続の読み取りすることを完全なメッセージを取得するために必要であることを意味する。)次にオーバーラップI/Oの名前付きパイプから読み取るときにメッセージが完全に読み取られたときを判断することはできますか?

、名前付きパイプで動作する場合代わりに、I/O重ねて読み出し動作が保留されている(のReadFile関数はFALSEのGetLastErrorを返します()戻りERROR_IO_PENDING)、私は操作が完了し、完全なメッセージを取得した場合、私はどのように知っていますか?私が決定できるのは、GetOverlappedResult関数を呼び出すことによって実際に転送されたバイト数ですが、完全なメッセージが読み取られたかどうかはわかりません。

私はここに何か不足していますか?

+0

あなたはあなたのパイプiocpをバインドすることができます。例えば、 'BindIoCompletionCallback'を介してコールバックで状態を取得できます。またはそれを自分のiocpにバインドすると、 'GetQueuedCompletionStatus'を呼び出すと操作ステータスが取得されます。 – RbMm

+1

私は意図的にこれを間違えたことはありませんが、私は購入していません。確かにGetOverlappedResultからERROR_MORE_DATAが得られます。あなたのバージョンを私達に見せなければなりません。 –

+0

* GetOverlappedResult関数ですが、完全なメッセージが読み込まれたかどうかはわかりません。*実際にはあなたに* false *を返し、 'GetLastError()'はメッセージが不完全な場合は 'ERROR_MORE_DATA'を返します。それが真実を返すなら、すべてが大丈夫です。 – RbMm

答えて

-1

私は最も簡単な方法は、あなたが予期しているメッセージがどれくらいであるかを知ることではないと思います。あなたのプロトコルがあなたに情報を与えるかもしれません。

たとえば、プロトコルは、完全なメッセージの長さを示す最初の2バイトとして常にWORDを配信します。

したがって、WORDの最初の2バイトを取得するには、ReadFileのオーバーラップI/Oを使用します。私はそれらを受け取ったときに、既知のメッセージ長を使って重複するI/OなしでReadFileを使用するので、すべてのデータを取得します。

関連する問題