2011-02-14 27 views
1

我正在尋找實現服務與其他服務/應用程序之間通信的不同選項。服務間單向通信選項

我想這樣做

我有一個不斷運行,輪詢連接到串行端口的設備的服務。在某些時候,這項服務應該向感興趣的客戶發送一條消息,其中包含從設備檢索到的數據。數據並不複雜,很可能只是一個字符串。

理想情況下,客戶端不必訂閱接收這些消息,這導致我進行某種事件「廣播」設置(類似於Windows事件)。消息發送過程不應該阻止,也不需要來自任何客戶端的響應(或者甚至有任何客戶端)。

我一直在閱讀關於IPC(尤其是COM)和Windows事件的知識,但我還沒有遇到與我想做的事情完全吻合的東西。

這是可能的嗎?如果是這樣,我應該使用什麼技術?如果不是,那麼一些可行的通信選擇是什麼?

這裏是設置的細節:

  • 在Windows 2000/XP環境
  • '服務器' 服務是一個Windows服務,採用VC++ 2005
  • 客戶會有所不同,但始終處於windows環境(通常客戶端是VC++ 6 windows服務,VB6應用程序)

任何幫助,將不勝感激!

+0

客戶端和服務器在同一臺機器? – 2011-02-14 01:12:17

+0

是的,他們都會在同一臺機器上。 – 2011-02-14 01:44:13

回答

0

有許多方法可以做廣播系統,但你必須放棄可靠性(即一些消息必須丟失)使用合適的訂閱系統。

如果您願意放棄可靠性,則可以創建共享內存段並命名爲手動重置事件對象。當新消息到達時,將其寫入共享內存段,發出事件對象的信號,然後關閉事件對象並使用不同名稱創建一個新對象(該名稱應位於shmem段的某處)。客戶打開shmem分段,找到當前事件對象,等待它發出信號,然後讀取消息和新事件段。

在此選項中,您必須小心處理客戶端讀取的情況,同時shmem段已正確更新。一種方法是在shmem段中有兩個序列號字段 - 一個在寫入新消息之前更新,一個在之後。客戶讀取第二個序列號之前的讀取消息,然後重新讀取兩個序列號後,並檢查它們是否相等(並放棄消息並在延遲後重試,如果它們不是的話)。請務必在訪問這些序列號時放置內存屏障,以確保編譯器不會對其重新排序!

當然,這是有點毛茸茸的。Named pipes要簡單得多,但需要訂閱(排序)。服務器呼叫CreateNamedPipe,然後接受與ConnectNamedPipe的連接。客戶端使用CreateFile連接到服務器的管道。然後服務器只是循環發送數據(使用WriteFile)到它的所有客戶端。請注意,每次接受連接時,您都需要使用CreateNamedPipe創建管道的其他實例。一個命名管道服務器的例子可以在這裏找到:http://msdn.microsoft.com/en-us/library/aa365588(v=vs.85).aspx

1

Windows支持廣播消息,請檢查here。您可以從服務中獲取SendMessageHWND_BROADCAST,然後在每個客戶端中接收它。

+0

感謝您的建議,我確實遇到了這個選項,但卻偶然發現需要傳遞數據和從服務發送消息(以LOCALSYSTEM身份運行)的能力。我會進一步調查。 – 2011-02-14 01:44:59