gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 10:12:39 29 4
gpt4 key购买 nike

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

我得到了错误

231 (All pipe instances are busy).

作者(客户):

#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 读取或发送超时。

最佳答案

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

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

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

关于无法打开 Windows 命名管道进行写入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53052210/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com