命名管道无法连接第二次

时间:2017-02-15 15:41:06

标签: c++ winapi named-pipes

我有一个客户端 - 服务器管道进程,当我第一次尝试连接时,一切正常,但是当我再次启动客户端进程而不重新启动服务器时,我无法连接PIPE_BUSY错误,尽管GetOverlappedResult在服务器上成功,但是waitforsingleobject没有发出信号表明某人已连接且消息当然是空的。

std::wstring buffer;
while (true) {
    // pinging here...
    DWORD result = WaitForSingleObject(hEvent, 2000);

    if (result == WAIT_FAILED) {
        std::wcout << result << std::endl;
        break;
    }

    if (result == WAIT_TIMEOUT) {
        // always here 
    }

    ResetEvent(hEvent);

    DWORD bytesTransferred;

    OVERLAPPED ov;
    ZeroMemory( & ov, sizeof(OVERLAPPED));
    ov.hEvent = hEvent;

    if (GetOverlappedResult(pipe(), & ov, & bytesTransferred, TRUE) == 0) // FAILED
    {
        return; // we do never get here...
    } else {
        ZeroMemory( & ov, sizeof(OVERLAPPED));

        DWORD bytesToRead = 0;

        BOOL pingPipe;

        Timer timer(1000);

        while (!bytesToRead || !pingPipe) {
            if (!timer.in()) {
                break;
            }

            pingPipe = PeekNamedPipe(pipe(), NULL, 0, NULL, & bytesToRead, NULL);
        }

        buffer.resize(sizeof(TCHAR) * bytesToRead);

        if (!ReadFile(pipe(), & buffer[0], bytesToRead, & bytesTransferred, & ov) && timer.in()) {
            if (GetLastError() == ERROR_IO_PENDING) {
                continue;
            }

            return;
        }

        // data here
        std::wcout << buffer << std::endl;
    }
}

DisconnectNamedPipe(pipe());

1 个答案:

答案 0 :(得分:1)

由于您遗漏了所有初始化代码,我无法确切地说明hEvent是什么,但您错误地使用了GetOverlappedResult,并且所有投注都非常关闭:< / p>

OVERLAPPED ov;
ZeroMemory( & ov, sizeof(OVERLAPPED));
ov.hEvent = hEvent;

if (GetOverlappedResult(pipe(), & ov, & bytesTransferred, TRUE) == 0) ...

这不是你怎么做的。您没有声明OVERLAPPED并将其全新传递给GetOverlappedResult。您必须实际启动重叠操作(读取,写入,连接等),例如首先将OVERLAPPED传递给ReadFile或其他内容。您提供的事件处理通常是您已创建的专用到该重叠任务的事件,而不是其他任何人也在使用的事件。

这相当于你走到街上一个随意的陌生人身边,无处不在地说,&#34;所以,你得到了我要求的东西吗?&#34;。

您尝试完成尚未启动的重叠操作,并且您正在使用可能也用于检查传入连接或事物的事件句柄。因此,它将会在未来发生什么事情。

所以你有两个选择:

  1. 阅读this tutorial(我尚未验证其正确性,但一目了然看起来很好),this overview of overlapped I/Othe MS example of named pipe servers with overlapped I/O,然后再次阅读,直到您明白为止它,或
  2. 停止使用重叠I / O.这就是我现在推荐的只是为了让概念失效。
  3. 除了上述内容之外,您的客户端可能还有其他问题,但您尚未显示相应的代码。您可能希望根据相关文档对其进行双重检查,以确保该方面的一切正常。此外,只要缺少代码,您就要通过在创建时传递适当的标记来验证您是否在服务器端以重叠模式创建管道(无法在电话上查找)对于此编辑,但检查管道创建api文档)。