我对管道知之甚少,但已经用Visual C++中的代码连接了两个进程。管道工作正常,但我需要将错误处理添加到同一个管道中,因此想知道如果创建它的服务器崩溃了,管道将会发生什么情况,并且如何从客户端进程识别它?如果服务器崩溃,命名管道会发生什么?
如果客户端进程在服务器崩溃后尝试访问同一管道(如果没有错误处理),那么会发生什么?
编辑: 将带来哪些影响那里的记忆,如果我继续创造新的管道(比如说通过使用系统时间作为管道名),而此前是因为服务器崩溃的坏了?这些破碎的管道是否会从内存中移除?
我对管道知之甚少,但已经用Visual C++中的代码连接了两个进程。管道工作正常,但我需要将错误处理添加到同一个管道中,因此想知道如果创建它的服务器崩溃了,管道将会发生什么情况,并且如何从客户端进程识别它?如果服务器崩溃,命名管道会发生什么?
如果客户端进程在服务器崩溃后尝试访问同一管道(如果没有错误处理),那么会发生什么?
编辑: 将带来哪些影响那里的记忆,如果我继续创造新的管道(比如说通过使用系统时间作为管道名),而此前是因为服务器崩溃的坏了?这些破碎的管道是否会从内存中移除?
IIRC的的ReadFile或WriteFile函数将返回FALSE,GetLastError()将返回STATUS_PIPE_DISCONNECTED
我想这样的处理在你的代码中实现,如果不是你应该更好地将其添加;-)
我只是想把它扔到那里。
如果您想要在两个应用程序之间传输数据的可生存方法,您可以考虑使用MSMQ或甚至引入BizTalk或其他消息平台。
有几件事情要考虑:
这些上下文中的每一个表示潜在的数据丢失。如果数据丢失是不可接受的,那么命名管道不是您应该使用的机制。相反,你需要以某种方式坚持消息。
MSMQ,存储到数据库,甚至利用Biztalk都可以处理消息本身的生存性。
如果发生1或3,那么命名管道将消失,并且必须由服务器应用程序的新实例重新创建。如果#2发生,那么管道将不会消失,直到有人重新启动服务器或杀死服务器应用程序并再次启动。
无论如何,客户端应用程序需要处理上述问题。他们归结为连接失败的问题。根据客户端的具体情况,您可能会进入等待状态,并且每隔一段时间都要ping服务器以查看它是否再次返回。
不知道数据和通信过程的性质,很难推荐适当的方法。
你确定MailSlots持久吗?也许你的意思是MQ像MSMQ,而不是MailSlot? – user1121956 2012-12-03 10:14:07
@ user1121956:哇,你说得对。我的意思是MSMQ,而不是邮件插槽。当拥有的进程关闭时,邮件槽被终止并且未读消息被删除。所以,那肯定不是一个好主意。 – NotMe 2012-12-03 18:40:31
请注意,添加错误处理的最佳方法是检查您调用的所有函数的文档,以查看其所有可能的错误响应。把它们全部处理掉,也许考虑到造成这种错误的条件。你在做什么,正在考虑一个特定的错误条件,并找出它引起的错误反应。除非你非常有想象力,否则结果就是你的代码中会存在一些未处理的错误。 – 2010-10-10 18:03:30
嗨,我被告知考虑服务器崩溃,并且不知道在这种情况下管道会发生什么情况,你能帮忙吗? – Sneha 2010-10-10 18:07:41
我想弄清楚你的意思是“服务器崩溃”你的意思是如果服务器本身死亡,或者你的意思是如果你的应用程序崩溃? – NotMe 2010-10-11 16:34:10