lin*_*s77 5 c++ windows events winapi named-pipes
我开始使用命名管道,需要在两个本地进程之间使用它们进行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???
}
}
Run Code Online (Sandbox Code Playgroud)
Ant*_*nko 10
您不应PIPE_NOWAIT与重叠模式一起使用(已弃用).如果没有连接客户端PIPE_NOWAIT,ConnectNamedPipe立即返回ERROR_PIPE_LISTENING; 重叠I/O只是没有发生,等待事件是没用的.
您可以PIPE_NOWAIT定期设置和轮询管道直到成功,或者设置FILE_FLAG_OVERLAPPED并使用事件来检查/等待完成.