6

名前付きパイプから始めて、2 つのローカル プロセス間の IPC に使用する必要があります。非ブロック重複モードでパイプを使用するサーバーとクライアントの両方のプロセスがあります。

OVERLAPPED 構造体を介して ConnectNamedPipe() に渡されたイベントが期待どおりに通知されない (クライアントが接続したときに通知される) ことを除いて、すべて正常に動作します (サーバーはクライアントから送信された文字列を正常に受信します)。

サーバーが WaitForSingleObject() 呼び出しでブロックされている間、クライアント プロセスはパイプに接続され、データを送信して終了しましたが、イベントは通知されません。私は何が欠けていますか?

サーバーコード:

HANDLE hPipe = ::CreateNamedPipeW(
    L"\\\\.\\pipe\\ThePipe",
    PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED,
    PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_NOWAIT,
    1,
    4096,
    4096,
    100,
    nullptr);

OVERLAPPED ov = {0};
ov.hEvent = ::CreateEventW(nullptr, TRUE, FALSE, nullptr);

BOOL retVal = ::ConnectNamedPipe(hPipe, &ov);

if (retVal == 0)
{
    DWORD err = ::GetLastError();
    if (err == ERROR_IO_PENDING)
    {
        ::WaitForSingleObject(ov.hEvent, 30000);
    }
    if (err == ERROR_PIPE_LISTENING)
    {
        ::WaitForSingleObject(ov.hEvent, 30000);    // this blocks until time-out???
    }
}
4

1 に答える 1

10

(非推奨)PIPE_NOWAITをオーバーラップ モードと一緒に使用しないでください。クライアントが接続されていない場合はPIPE_NOWAITConnectNamedPipeすぐに戻ります。ERROR_PIPE_LISTENING重複した I/O は発生せず、イベントの待機は役に立ちません。

PIPE_NOWAIT成功するまで定期的にパイプを設定してポーリングするかFILE_FLAG_OVERLAPPED、イベントを設定して使用して完了を確認/待機します。

于 2013-01-13T18:31:05.827 に答える