gpt4 book ai didi

named-pipes - Windows命名管道问题: Error code 233 alternates

转载 作者:行者123 更新时间:2023-12-04 06:48:22 26 4
gpt4 key购买 nike

我需要我正在制作的应用程序的帮助。这是一个响应命令行参数的简单程序。如果是第一次调用该应用程序,则它将在专用于它的另一个线程上作为管道服务器(阻塞,非重叠)启动,而主线程会执行其他操作。现在,用户仍然可以使用相同的应用程序可执行文件和命令行参数来调用应用程序,但是由于它不是应用程序的第一个实例,因此它使用管道将命令行参数传递给第一个实例,然后终止自身。因此,这就像是模式语言中的单例过程。

理想情况下,应该是这样的:

app.exe "first"    // starts app.exe as a pipe server and prints "first"
app.exe "second" // client process causes server instance to print "second"
app.exe "third" // client process causes server instance to print "third"
app.exe "fourth" // client process causes server instance to print "fourth"
app.exe "fifth" // client process causes server instance to print "fifth"
app.exe -quit // client process causes server instance to terminate.

现在,我唯一的问题是,当我执行上述操作时,就会发生这种情况:
app.exe "first"    // starts app.exe as a pipe server and prints "first"
app.exe "second" // client process returns a GetLastError code of 233
app.exe "third" // client process causes server instance to print "third"
app.exe "fourth" // client process returns a GetLastError code of 233
app.exe "fifth" // client process causes server instance to print "fifth"
app.exe -quit // client process returns a GetLastError code of 233

我的管道服务器代码如下所示(伪代码):
CreateNamedPipe();
// Code below now runs on a separate thread...
while( !Quit )
{
if( ConnectNamedPipe() is successful )
{
if( PeekNamedPipe() has a message )
{
ReadFile();
ProcessReceivedMessage();
}
FileFlushBuffers();
DisconnectNamedPipe();
}
}
CloseHandle( the pipe );

我的客户端版本如下所示(伪代码):
if( WaitNamedPipe( FOREVER ) != 0 )
{
GetParametersAndFormAMessage();
CreateFile();
WriteFile(); // Sends message to the pipe server
}
CloseHandle();

根据MSDN,如果服务器使用DisconnectNamedPipe(),则客户端将被强制断开连接,并且在客户端下次尝试时,他们将收到错误消息。你认为那是原因吗?如果是这样,如何在没有发生额外错误的情况下断开客户端连接?否则,我应该知道的一切才能使这项工作成功???花了很多时间来解决这个问题。

最佳答案

您应该在管道的不同服务器端实例上处理与每个客户端实例的通信,并为每个客户端实例使用单独的线程。因此,当ConnectNamedPipe()返回时,在处理来自刚刚连接的客户端的消息之前,立即产生一个新的监听器线程以等待下一个客户端。

然后,每个客户端将通过新创建的管道实例进行交谈,并且您不会看到ERROR_PIPE_NOT_CONNECTED错误。

即伪代码这样的代码:

Main Thread
{
CreateListenerThread();
WaitForQuitEvent();
}

ListenerThread
{
ConnectNamedPipe();
if (no error)
{
CreateListenerThread();
if( PeekNamedPipe() has a message )
{
ReadFile();
ProcessReceivedMessage(); // if -quit signal quit event
}
FileFlushBuffers();
DisconnectNamedPipe();
CloseHandle();
}
else
{
// handle/report error
}
}

关于named-pipes - Windows命名管道问题: Error code 233 alternates,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4451805/

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