名前付きパイプではじまり、2つのローカルプロセス間のIPCに使用する必要があります。私は、非ブロッキング・オーバーラップ・モードでパイプを使用するサーバーとクライアントの両方のプロセスを持っています。ノンブロッキングConnectNamedPipeイベントが通知されない
OVERLAPPED構造体を介してConnectNamedPipe()に渡されたイベントが、期待通りに通知されない(クライアントの接続時に通知される)ことを除いて、すべて正常に動作します(サーバーはクライアントから送信された文字列を受け取ります)。
サーバーがWaitForSingleObject()呼び出しでブロックされている間に、クライアントプロセスがパイプに接続し、データを送信して終了しましたが、イベントが通知されません。私は何が欠けていますか?
Serverコード:
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???
}
}
ERROR_IO_PENDINGを受け取っていますか? (あなたはこのケースを分かりやすくするか、プロセスにアタッチしてどこに待つかを確認するのがよいでしょう) –