我对管道知之甚少,但在Visual C ++中用我的代码连接两个进程。管道运行良好,但是我需要添加错误处理,因此想知道如果创建它的服务器崩溃会发生什么,以及如何从客户端进程识别它?
如果客户端进程在服务器崩溃后尝试访问同一个管道,如果没有实现错误处理,会发生什么?
修改 如果我继续创建新管道(比如使用系统时间作为管道名称)而前一个因服务器崩溃而被破坏,那么对内存有什么影响?这些破损的管道是否会从内存中移除?
答案 0 :(得分:1)
IIRC ReadFile或WriteFile函数将返回FALSE,GetLastError()将返回STATUS_PIPE_DISCONNECTED
我想这种处理是在您的代码中实现的,如果不是,您应该更好地添加它; - )
答案 1 :(得分:1)
我只是想把它扔出去。
如果您想要一种可存活的方法在两个应用程序之间传输数据,您可以考虑使用MSMQ甚至引入BizTalk或其他消息平台。
有几件事需要考虑:
每个上下文都代表了潜在的数据丢失。如果数据丢失是不可接受的,那么命名管道不是您应该使用的机制。相反,你需要以某种方式保留消息。
MSMQ,存储到数据库,甚至利用Biztalk可以处理消息本身的生存能力。
如果发生1或3,则命名管道消失,必须由服务器应用程序的新实例重新创建。如果#2发生,那么管道将不会消失,直到有人重新启动服务器或杀死服务器应用程序并再次启动它。
无论如何,客户端应用程序需要处理上述问题。他们归结为连接失败的问题。根据客户端的功能,它可能会进入等待状态并让它经常ping服务器以查看它是否再次返回。
如果不了解所涉及的数据和通信流程的性质,很难推荐适当的方法。