【发布时间】:2013-01-13 18:08:04
【问题描述】:
我从命名管道开始,需要将它们用于两个本地进程之间的 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???
}
}
【问题讨论】:
-
它是否收到 ERROR_IO_PENDING? (你最好让这种情况容易区分,或者你必须附加到进程,看看它在哪里等待)
标签: c++ windows winapi events named-pipes