如何优雅地停止正在侦听Windows上的管道的服务器进程

时间:2012-07-25 13:27:30

标签: windows visual-c++ named-pipes

我有一个类似于http://msdn.microsoft.com/en-us/library/windows/desktop/aa365588(v=vs.85).aspx的MSDN示例的命名管道服务器,并希望允许客户端发送“退出”消息,使服务器正常停止。

所以在“InstanceThread()”中,如果收到特殊消息,我想让服务器停止。

我试图通过关闭管道句柄从“InstanceThread()”的单独线程中停止对主线程中ConnectNamedPipe()的调用,但这不起作用。

我已经尝试了各种各样的东西,其中包括关闭整个管道,直接从InstanceThread退出,但是它们都没有导致对ConnectNamedPipe()的调用停止。

我使用了SetNamedPipeHandleState(),但它使实现变得非常复杂,同样使用重叠I / O对于这个简单的要求来说似乎有些过分。

当服务器进程停止而不是无休止地等待客户端连接时,有更简单的方法让ConnectNamedPipe()返回吗?

1 个答案:

答案 0 :(得分:6)

如果您不需要支持Windows XP,可以尝试使用CancelSynchronousIo

如果流程退出,则无需执行任何操作;当Windows取消该过程时,该线程将被终止。

或者,您可以通过自己连接到命名管道来调用ConnectNamedPipe