2010-10-10 118 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

相關問題