名前付きパイプから始めて、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???
}
}