1

次のシナリオを除いて、マルチスレッドアプリは非常にうまく機能しています。最初にパイプから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
4

1 に答える 1

0

WhozCraig が気付いたように、クライアントは DisconnectNamePIpe の前に FlushFileBuffers を実行しません。不運にも。

于 2013-06-15T08:36:51.317 に答える