如何正常地停止正在Windows上的pipe道上侦听的服务器进程

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

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

我试图通过closurespipe道句柄停止从“InstanceThread()”的单独线程主线程中的ConnectNamedPipe()的调用,但这是行不通的。

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

我玩SetNamedPipeHandleState(),但它使实现变得复杂,同样使用重叠的I / O似乎矫枉过正这个简单的要求。

那么有没有一种更简单的方法来获得ConnectNamedPipe()返回时应停止服务器进程,而不是无休止地等待客户端连接?

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

如果这个过程正在退出,你不需要做任何事情; 当Windows断开进程时,该线程将被终止。

或者,您可以简单地通过连接到命名管道来调用ConnectNamedPipe退出。