次のシナリオを除いて、マルチスレッドアプリは非常にうまく機能しています。最初にパイプから16バイトを読み取り、次にヘッダーに応じて残りを読み取ります。
問題は、クライアントがメッセージ (たとえば 300 バイトの長さ) を書き込んでから接続を閉じることがあるということです。
私のサーバーは最初の 16 バイトを受信し、残りの 284 バイトを取得することにしましたが、ReadFile はエラー 233 を返します (パイプの反対側にプロセスはありません)。
では、これらの 284 バイトはどこに行くのでしょうか? それらはパイプバッファか何かにあるはずだと思います。
ネット上のすべての例で通常のように作成されたパイプ:
HANDLE h= CreateNamePipe(
name, // pipe name
PIPE_ACCESS_DUPLEX | // read/write access
FILE_FLAG_OVERLAPPED, // overlapped mode
PIPE_TYPE_MESSAGE | // message-type pipe
PIPE_READMODE_MESSAGE | // message read mode
PIPE_WAIT, // blocking mode
PIPE_UNLIMITED_INSTANCES, // unlimited instances
100000, // output buffer size
100000, // input buffer size
0, // client time-out
lpSecurityAttributes); // default security attributes