无法打开Windows命名管道进行编写?

时间:2018-10-29 19:05:01

标签: c windows winapi named-pipes

我不明白为什么我什至不能打开我在另一个进程中创建的命名管道来编写。

我收到错误

  

231(所有管道实例均处于繁忙状态)。

作者(客户):

#include "Windows.h"
#include <stdio.h>
#include <errno.h>

int main()
{
    HANDLE hpipe;
    DWORD written;
    char msg[] = "play asdf.wav";

    hpipe = CreateFileA("\\\\.\\pipe\\isp-control",
               GENERIC_WRITE | GENERIC_READ,
               0, NULL, OPEN_EXISTING, 0, NULL);

    if (hpipe != INVALID_HANDLE_VALUE)
    {
      WriteFile(hpipe, msg, strlen(msg) + 1, &written, NULL);
      printf("wrote %d bytes of %d: '%s'\n", written, strlen(msg) + 1, msg);

      CloseHandle(hpipe);
    }
    else
    {
      printf("error %d opening pipe (handle %d)\n", GetLastError(), (int) hpipe);
      return 1;
    }

    return 0;
}

读取器(服务器)之前已经创建了这样的管道(请注意4个实例,所以一个实例应该是免费的,不是吗?)

hpipe_ = CreateNamedPipeA("\\\\.\\pipe\\isp-control",
             PIPE_ACCESS_DUPLEX,
             PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT,
             4, // number of instances
             1024 * 16, // output buffer size
             65535,  // input size
             2000, // default timeout ms 
             NULL);

,然后使用PeekNamedPipe查看是否有ReadFile要读取的数据或发送超时。

1 个答案:

答案 0 :(得分:2)

CreateNamedPipe-nMaxInstances的第4个参数-这是可以为此管道创建的最大实例数。

因此,这不是在单个调用中创建的实例计数,而是可以创建的最大计数。对CreateNamedPipe的单次调用始终会创建一(1)个管道实例。如果您要有4个实例-您需要呼叫CreateNamedPipe 4次。最初也是在监听状态下创建管道,因此客户端可以通过调用CreateFile来连接到它。但是在连接断开之后(因为客户端关闭了自己的句柄),并且您想接受同一管道实例的新客户端连接-您需要先调用DisconnectNamedPipe然后再调用ConnectNamedPipe-仅在此新客户端可以再次连接到相同的管道实例。

但是无论如何,即使您仅创建单个管道实例,也可以通过一次调用CreateNamedPipeA-第一个客户端可以连接到它。错误231-我想错误的真正根源是STATUS_PIPE_NOT_AVAILABLE命名管道的实例不能是 (在侦听状态下找到)-您可以在RtlGetLastNtStatus()失败后通过调用CreateFile进行检查,而不是GetLastError()说管道名称有效,访问没有问题,但是已经有人连接(可能已经断开连接)到管道-永远不要先调用CreateFile返回此错误