2010-01-20 65 views
0

我在這裏讀到:Error 10048 when trying to open TcpChannel的TcpChannel註冊問題

我有什麼,我認爲是一個類似的問題 - 顯然不是。我拿了第一respondant的建議重置winsock的不管怎麼說,這是我的節目註冊(如何winsock的遭到損壞,無論如何?):

channel = new TcpChannel(channelPort); 
ChannelServices.RegisterChannel(channel, false); 

和客戶端調用:

// Create a channel for communicating w/ the remote object 
// Notice no port is specified on the client 
TcpChannel channel = new TcpChannel(); 
ChannelServices.RegisterChannel(channel, false); 

// Create an instance of the remote object 
CommonDataObject obj = Activator.GetObject(typeof(CommonDataObject) , 
    "tcp://localhost:49500/CommonDataObject") as CommonDataObject; 

這似乎太簡單了,以至於無法使用這樣的麻煩。但是,問題似乎與服務器的ChannelServices.RegisterChannel(...)。現在,我包含客戶端部分的原因是因爲客戶端實例檢查服務器對象。如果它找不到它,那麼它會'推動'服務器來實例化它自己。我想知道的是,如果首先檢查對象的可用對象(a la:Activator.GetObject(...))是否會導致ChannelServices'認爲'此tcp通道已被註冊?這聽起來很愚蠢,但那是我唯一可能的解釋。我已關閉防火牆,防真菌應用程序,並重新啓動。仍收到此

通道'tcp'已經註冊了 。

我看着我的堆棧跟蹤,並沒有通知:

at System.Runtime.Remoting.Channels.ChannelServices.RegisterChannelInternal(IChannel chnl, Boolean ensureSecurity) 
    at System.Runtime.Remoting.Channels.ChannelServices.RegisterChannel(IChannel chnl, Boolean ensureSecurity) 

我想知道是否RegisterChannelInternal(...)可能是什麼原因造成的「已經registerd」的問題。所以,除此之外,我不知所措......

這可能是我正在檢查該頻道的呼叫導致它。如果這是共識,那麼我的問題就變成:我怎樣才能爲頻道進行投票?

更新: 從客戶端刪除服務器的初始檢查並'假設'服務器需要實例後,我確實發現客戶端檢查導致了問題。我設法讓服務器繼續運行,並且客戶端確實獲得了一個「透明代理」對象。但問題仍然存在:「我如何進行輪詢以發現服務器是否已實例化?」

回答

0

答案很明顯,是的......當客戶端註冊頻道時,它使服務器避免註冊另一個Tcp頻道。我已經刪除了Tcp頻道的客戶端實例和註冊。

由於我還沒有得到答案的ping,我正在通過obj = Activator.GetObject(...)上的try/catch塊。如果obj返回null,那麼我'推動'服務器,它會啓動...然後客戶端連接到CommonDataObject(從MarshalByRefObject派生)。

因此,從某種意義上說,這就是我正在使用的輪詢技術。我想要一些更優雅的東西 - 也就是說,一個實現不會導致失敗。對我而言,這比解決方案更適合黑客工作。我找到答案here。感謝Abhijeet爲無意中的解決方案! Btw ...別忘了聲明:

using System.Linq;