2010-10-10 105 views
3

我对管道知之甚少,但已经用Visual C++中的代码连接了两个进程。管道工作正常,但我需要将错误处理添加到同一个管道中,因此想知道如果创建它的服务器崩溃了,管道将会发生什么情况,并且如何从客户端进程识别它?如果服务器崩溃,命名管道会发生什么?

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

编辑: 将带来哪些影响那里的记忆,如果我继续创造新的管道(比如说通过使用系统时间作为管道名),而此前是因为服务器崩溃的坏了?这些破碎的管道是否会从内存中移除?

+1

请注意,添加错误处理的最佳方法是检查您调用的所有函数的文档,以查看其所有可能的错误响应。把它们全部处理掉,也许考虑到造成这种错误的条件。你在做什么,正在考虑一个特定的错误条件,并找出它引起的错误反应。除非你非常有想象力,否则结果就是你的代码中会存在一些未处理的错误。 – 2010-10-10 18:03:30

+0

嗨,我被告知考虑服务器崩溃,并且不知道在这种情况下管道会发生什么情况,你能帮忙吗? – Sneha 2010-10-10 18:07:41

+0

我想弄清楚你的意思是“服务器崩溃”你的意思是如果服务器本身死亡,或者你的意思是如果你的应用程序崩溃? – NotMe 2010-10-11 16:34:10

回答

1

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

我想这样的处理在你的代码中实现,如果不是你应该更好地将其添加;-)

+0

而且会发生破损的管道?将它从内存中删除,以防我重用相同的命名管道? – Sneha 2010-10-10 18:04:07

+0

您关闭管道(客户端句柄)的句柄,然后尝试重新连接。然后它会告诉你Windows错误代码2(找不到文件),或者如果服务器启动,它将能够重新连接。 – Vinzenz 2010-10-10 18:13:56

+0

如果我继续创建新管道,而前一个由于服务器崩溃而中断,会对内存产生什么影响? – Sneha 2010-10-11 16:18:46

1

我只是想把它扔到那里。

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

有几件事情要考虑:

  1. 如果重新启动服务器,会发生什么或失去动力?
  2. 如果服务器应用程序无响应会发生什么?
  3. 如果服务器应用程序完全死亡或消失,会发生什么情况?
  4. 以上每个客户端应用程序的适当响应是什么?

这些上下文中的每一个表示潜在的数据丢失。如果数据丢失是不可接受的,那么命名管道不是您应该使用的机制。相反,你需要以某种方式坚持消息。

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

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

无论如何,客户端应用程序需要处理上述问题。他们归结为连接失败的问题。根据客户端的具体情况,您可能会进入等待状态,并且每隔一段时间都要ping服务器以查看它是否再次返回。

不知道数据和通信过程的性质,很难推荐适当的方法。

+0

你确定MailSlots持久吗?也许你的意思是MQ像MSMQ,而不是MailSlot? – user1121956 2012-12-03 10:14:07

+0

@ user1121956:哇,你说得对。我的意思是MSMQ,而不是邮件插槽。当拥有的进程关闭时,邮件槽被终止并且未读消息被删除。所以,那肯定不是一个好主意。 – NotMe 2012-12-03 18:40:31

相关问题