2011-09-26 15 views
2

我在尋找一種機制用來創建一個簡單的多對許多消息系統,讓Windows應用程序在一臺機器上,但在會話和桌面通信。許多一對多本地機器上的消息沒有經紀人

我有以下的硬要求:

  1. 必須在所有的Windows會話運行在一臺機器上。
  2. 必須在Windows XP和更高版本上運行。
  3. 無需全局配置。
  4. 沒有中央協調員/經紀人/服務器。
  5. 不得要求應用程序提升特權。

不要要求保證傳遞的消息。

我看了很多很多選項。這是我對想法的最後要求。

以下已經被拒絕違反上述要求的一個或多個:

ZeroMQ:爲了多對許多消息需要中央的代理做。
命名管道:需要中央服務器接收消息並轉發它們。
多播套接字:需要正確配置的網絡卡與有效的IP地址,即全局配置。
共享存儲器隊列:爲了在全局命名空間需要提升的權限創建共享內存。

多播套接字等近作品。還有什麼人可以建議?我會考慮從預打包庫到裸機Windows API功能的任何內容。


編輯9月27日)更多的位上下文:

通過「中央協調器/代理/服務器」,我的意思是必須在時間運行的應用程序試圖單獨的工藝發送一個消息。我看到的問題是,不可能保證這個過程真的會在需要時運行。通常會使用Windows服務,但無法保證在用戶登錄之前始終啓動特定服務,或者確保某個服務未因某種原因而停止。按需運行會在服務啓動時發送第一條消息時引入延遲,並引發特權問題。

組播插座近的工作,因爲它會設法避免完全的中心協調處理的需要,並不需要發送或接收組播數據包的應用程序提升權限。但是你必須有一個配置好的IP地址 - 你不能在環回接口上進行多播(即使在配置好的網卡上TTL = 0的組播的行爲與預期的環回多播一樣) - 那就是交易斷路器。

+0

「跨會話和桌面」暗示Citrix還是這樣? –

+0

我在想快速的用戶切換和終端服務。 –

回答

0

最後,我決定必須解決其中的一個難題,因爲問題不能像原來所說的那樣以任何合理的方式解決。

我的最終解決方案是運行命名管道服務器的Windows服務。任何應用程序或服務都可以連接到管道的實例併發送消息。任何由服務器接收到的消息都被回顯給所有管道實例。

我真的很喜歡p.marino的回答,但最終它看起來像是一個非常基本的功能的複雜性很多。

另一種吸引我的可能性是,雖然它又陷入了複雜的障礙,但是編寫了一個內核驅動來管理多播。在這種情況下可能會有幾種機制,但編寫無缺陷內核驅動程序的開銷太高。

0

如何UDP broadcasting

+0

http://codeidol.com/csharp/csharp-network/IP-Multicasting/What-Is-Broadcasting/ - 體面的例子。 –

+0

這是我的'Multicast Sockets'選項。但是你不能廣播或多播到環回地址。需要配置IP地址,這違反了約束條件3.並非所有要安裝此軟件的計算機都將具有配置了IP地址的網絡接口卡。 –

+0

如果有些機器甚至沒有網絡接口,我覺得很奇怪,你說多播幾乎工作。這些機器是否從控制檯運行?爲什麼沒有網絡接口?聽起來很奇怪。 –

0

難道你不能使用本地主機套接字?

/託尼

+0

發送到本地主機的數據報只能由一個監聽器接收。發件人必須保留聽衆名單,實際上成爲協調過程並違反上述要求4。 –

+0

我剛剛檢查過,如果sendto()INADDR_LOOPBACK(即不是多播),那麼只有第一個應用程序開始偵聽套接字纔會獲取消息。我需要聽衆每個人都得到一份副本。 –

1

也許我完全誤解了問題,尤其是「沒有中央的代理」,但你有沒有考慮一些基於tuple spaces

- 的意見交換之後,請考慮以下爲我的「權威」的答案,那麼:

使用基於文件的解決方案,並主持目錄樹一個Ramdisk,以確保良好的性能。

我也建議看看下面的StackOverflow discussion(即使它是基於Java的),以獲取如何管理文件系統上的鎖定和事務的可能指示。

This one(基於.NET)也可能有幫助。

+0

我可以實現使用共享內存。但是要在Windows Vista上的全局命名空間中創建共享內存,以後需要提升特權,這使得它對我的特定應用程序來說是不可行的。無論如何,我正在尋找一個更低層次的概念 - 理論上來說,它是一個像元組空間這樣的實現,它不違反我上面列出的要求。 –

+0

那麼基於文件系統的解決方案呢?即將你的元組空間實現爲一組目錄/文件?性能問題? –

+0

這是一種可能性,但看起來很快,正如你所說的,表現不佳。 –

相關問題