C++ 命名管道服务器可以';无法获取管道句柄状态
我目前正在开发一个作为命名管道服务器的应用程序。此应用程序仅用于将数据发送到客户端(不是由我编写的),但也需要在管道破裂时得到通知。我的想法是使用C++ 命名管道服务器可以';无法获取管道句柄状态,c++,winapi,named-pipes,C++,Winapi,Named Pipes,我目前正在开发一个作为命名管道服务器的应用程序。此应用程序仅用于将数据发送到客户端(不是由我编写的),但也需要在管道破裂时得到通知。我的想法是使用GetNamedPipeHandleState()检索管道实例的数量,并查看管道是否仍然驻留在系统中。如果不再连接,程序将重置管道,以便客户端可以重新连接并恢复从应用程序提取数据。不幸的是,我无法检索管道的实例数。无论何时调用,函数都会失败,返回ERROR\u ACCESS\u DENIED。但是,仅当我按以下方式尝试调用时,才会发生这种情况: Get
GetNamedPipeHandleState()
检索管道实例的数量,并查看管道是否仍然驻留在系统中。如果不再连接,程序将重置管道,以便客户端可以重新连接并恢复从应用程序提取数据。不幸的是,我无法检索管道的实例数。无论何时调用,函数都会失败,返回ERROR\u ACCESS\u DENIED
。但是,仅当我按以下方式尝试调用时,才会发生这种情况:
GetNamedPipeHandleStateA(pipe,0,&npipeinstances,0,0,0,0);
pipe=CreateNamedPipeA(pipename, // name of the pipe
PIPE_ACCESS_OUTBOUND, // read/write access
PIPE_TYPE_MESSAGE | // message type pipe
PIPE_WAIT, // blocking mode
1, // max. instances
65535, // output buffer size
65535, // input buffer size
300, // client time-out
NULL); // default security attribute
如果我这样调用函数:
GetNamedPipeHandleStateA(pipe,0,0,0,0,0,0);
没有错误发生,但我没有收到任何状态信息。是否有可能丢失的创建参数,或者有更好的方法检查此信息
管道的创建代码如下所示:
GetNamedPipeHandleStateA(pipe,0,&npipeinstances,0,0,0,0);
pipe=CreateNamedPipeA(pipename, // name of the pipe
PIPE_ACCESS_OUTBOUND, // read/write access
PIPE_TYPE_MESSAGE | // message type pipe
PIPE_WAIT, // blocking mode
1, // max. instances
65535, // output buffer size
65535, // input buffer size
300, // client time-out
NULL); // default security attribute
从:
hNamedPipe[在]指定管道的句柄,为该管道提供信息
受通缉的句柄必须具有只读或
读/写管道,或者它必须具有通用的\u写和
仅写管道的文件读取属性访问
如果您仅使用pipe\u ACCESS\u OUTBOUND
打开管道句柄(pipe
),我认为您不满足此条件。因此错误\u访问被拒绝错误。来自:
hNamedPipe[在]指定管道的句柄,为该管道提供信息
受通缉的句柄必须具有只读或
读/写管道,或者它必须具有通用的\u写和
仅写管道的文件读取属性访问
如果您仅使用pipe\u ACCESS\u OUTBOUND
打开管道句柄(pipe
),我认为您不满足此条件。因此出现了ERROR\u ACCESS\u DENIED
ERROR。好吧,如果您使用所有参数[除了句柄]零调用它,那么当您使用&npipeinstances
@Mats调用它时,它可能会跳过为您提供ERROR\u ACCESS\u DENIED的检查,这仍然留下了解决问题的主要问题。我可能可以通过检查WriteFile的返回来破解它,但是我需要在没有数据要写的情况下进行检查(这会跳过WriteFile调用)。这似乎是最好的检查方法,除非我在API中遗漏了什么。这是错误的方法。管道破裂是一个重大的灾难,您可以“重新连接”到同一个客户端实例的可能性非常小。当ReadFile()调用失败时,您就会发现它。您应该始终有一个挂起,以便能够快速响应客户端发送。因此,不需要单独轮询。可能是这样,但创建管道时仅具有写访问权限。ReadFile在该管道上无论如何都不起作用。对于重新连接,当管道连接丢失时,服务器端的管道将关闭,并以相同的名称打开,几乎就像流程重新开始一样。如果客户端重新连接,它将发现管道不存在(在这种情况下,它可以等待并重试),或者发现管道存在,然后重新建立管道。这也是用户要求的行为,因此没有真正的方法来改变它。这个问题与a有点关系。好吧,如果你在所有参数[除了句柄]为零的情况下调用它,当您使用&npipeeinstances
@Mats调用时,它可能会跳过给您提供错误\u访问\u拒绝的检查,这仍然是解决问题的主要问题。我可能可以通过检查WriteFile的返回来破解它,但是我需要在没有数据要写的情况下进行检查(这会跳过WriteFile调用)。这似乎是最好的检查方法,除非我在API中遗漏了什么。这是错误的方法。管道破裂是一个重大的灾难,您可以“重新连接”到同一个客户端实例的可能性非常小。当ReadFile()调用失败时,您就会发现它。您应该始终有一个挂起,以便能够快速响应客户端发送。因此,不需要单独轮询。可能是这样,但创建管道时仅具有写访问权限。ReadFile在该管道上无论如何都不起作用。对于重新连接,当管道连接丢失时,服务器端的管道将关闭,并以相同的名称打开,几乎就像流程重新开始一样。如果客户端重新连接,它将发现管道不存在(在这种情况下,它可以等待并重试),或者发现管道存在,然后重新建立管道。这也是用户要求的行为,所以没有真正的方法来改变它。这个问题与a有点关联。我遇到了同样的问题。只能使用GENERIC_WRITE | FILE_READ_ATTRIBUTES
打开入站-(到服务器)管道的客户端,然后GetNamedPipeInfo
可以正常工作,但我还没有找到任何方法为仅出站管道的服务器端获取相同的访问集。荒唐的我遇到了同样的问题。只能使用GENERIC_WRITE | FILE_READ_ATTRIBUTES
打开入站-(到服务器)管道的客户端,然后GetNamedPipeInfo
可以正常工作,但我还没有找到任何方法为仅出站管道的服务器端获取相同的访问集。荒唐的