c语言 - 无法打开 Windows 命名管道进行写入?



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

我得到错误

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);

然后使用CCD_ 1查看是否有数据要用CCD_ 2读取或发送超时。

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

所以这不是在单个调用中创建的实例计数,而是可以创建的最大计数。对CreateNamedPipe的单个调用总是创建一(1(个管道实例。如果你想要有4个实例,你需要调用CreateNamedPipe4次。最初也是在侦听状态下创建的管道,所以客户端可以通过调用CreateFile连接到它。但是在连接断开之后(因为客户端关闭了自句柄(,并且您希望接受同一管道实例的新客户端连接-您需要调用DisconnectNamedPipe,然后调用ConnectNamedPipe-只有在这个新客户端可以再次连接到同一管道示例之后。

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

最新更新