c++ - 非阻塞 ConnectNamedPipe 事件未收到信号

标签 c++ windows winapi events 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???
    }
}

最佳答案

您不应将(已弃用)PIPE_NOWAIT 与重叠模式一起使用。 PIPE_NOWAIT 使 ConnectNamedPipe 在没有客户端连接时立即返回 ERROR_PIPE_LISTENING;重叠 I/O 不会发生,等待事件是无用的。

要么设置 PIPE_NOWAIT 并定期轮询管道直到成功,要么设置 FILE_FLAG_OVERLAPPED 并使用事件来检查/等待完成。

关于c++ - 非阻塞 ConnectNamedPipe 事件未收到信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14306499/

相关文章:

C#:没有完全扩展环境变量?

c# - 从 C# 注册自定义 win32 窗口类

c++ - 使用共享指针时是否需要设置析构函数方法?

c++ - 创建附加到控制台但具有重定向标准 IO 句柄的进程

windows - 从 WSL2 内部访问在 Windows 中运行的本地主机?

winapi - 如何将可编辑的 ComboBox 添加到 Vista 的 Common Item Dialog?

c++ - 如何将子窗口的客户区保存到位图文件中?

c++ - 尝试只插入单词的第一个字母,而不是整个单词

c++ - epoll等待修改文件描述符集

c++ - STL的意义何在?