如果服务器崩溃,命名管道会发生什么?

时间:2010-10-10 16:34:08

标签: c++ windows named-pipes

我对管道知之甚少,但在Visual C ++中用我的代码连接两个进程。管道运行良好,但是我需要添加错误处理,因此想知道如果创建它的服务器崩溃会发生什么,以及如何从客户端进程识别它?

如果客户端进程在服务器崩溃后尝试访问同一个管道,如果没有实现错误处理,会发生什么?

修改 如果我继续创建新管道(比如使用系统时间作为管道名称)而前一个因服务器崩溃而被破坏,那么对内存有什么影响?这些破损的管道是否会从内存中移除?

2 个答案:

答案 0 :(得分:1)

IIRC ReadFile或WriteFile函数将返回FALSE,GetLastError()将返回STATUS_PIPE_DISCONNECTED

我想这种处理是在您的代码中实现的,如果不是,您应该更好地添加它; - )

答案 1 :(得分:1)

我只是想把它扔出去。

如果您想要一种可存活的方法在两个应用程序之间传输数据,您可以考虑使用MSMQ甚至引入BizTalk或其他消息平台。

有几件事需要考虑:

  1. 如果服务器重启或断电会怎样?
  2. 如果服务器应用程序无响应会怎样?
  3. 如果服务器应用程序被杀或完全消失会怎样?
  4. 上述每个客户端应用程序的适当响应是什么?
  5. 每个上下文都代表了潜在的数据丢失。如果数据丢失是不可接受的,那么命名管道不是您应该使用的机制。相反,你需要以某种方式保留消息。

    MSMQ,存储到数据库,甚至利用Biztalk可以处理消息本身的生存能力。

    如果发生1或3,则命名管道消失,必须由服务器应用程序的新实例重新创建。如果#2发生,那么管道将不会消失,直到有人重新启动服务器或杀死服务器应用程序并再次启动它。

    无论如何,客户端应用程序需要处理上述问题。他们归结为连接失败的问题。根据客户端的功能,它可能会进入等待状态并让它经常ping服务器以查看它是否再次返回。

    如果不了解所涉及的数据和通信流程的性质,很难推荐适当的方法。