2010-11-09 16 views
1

對於我們正在開發的項目,我們使用.NET遠程處理在服務器和客戶端之間進行通信。到目前爲止,我們一直在同一臺機器上測試它,並使用本地主機和任意端口號進行測試。但是,當在同一網絡上的兩臺機器之間進行測試時,使用主要組件,但代理對象失敗。兩臺機器之間的.NET遠程處理時發生套接字錯誤

我們正在使用的配置文件來設置服務器名和端口,如:

<setting name="ServerName" serializeAs="String"> 
    <value>192.168.1.141</value> 
</setting> 
<setting name="Port" serializeAs="String"> 
    <value>9932</value> 
</setting> 

客戶端設置了遠程對象如下:

_port = global::ConsoleClient.Properties.Settings.Default.Port; 
_servername = global::ConsoleClient.Properties.Settings.Default.ServerName; 

string url = "tcp://" + _servername + ":" + _port + "/Lobby"; 

try 
{ 
    ChannelServices.RegisterChannel(new TcpClientChannel(), false); 
    Lobby lobby = (Lobby)Activator.GetObject(
     typeof(Lobby), url); 
} 
catch (Exception e) 
{ 
} 

這工作得很好,我們能夠調用大廳對象上的方法。但是,後來在代碼中,我們返回另一個對象,表如下:

table_proxy = lobby_proxy.joinTable(userID, i); 

其中lobby_proxy是在現有代碼相同的大堂對象。該服務器被配置以下列方式:

_port = global::Server.Properties.Settings.Default.Port; 
_lobby = new Lobby(_db); 

try 
{ 
    TcpServerChannel channel = new TcpServerChannel(_port); 
    ChannelServices.RegisterChannel(channel, false); 
    RemotingConfiguration.RegisterWellKnownServiceType(typeof(Lobby), 
      "Lobby", WellKnownObjectMode.Singleton); 
    RemotingServices.Marshal((_lobby), "Lobby"); 
    System.Console.WriteLine("Press Any Key"); 
} 
catch (Exception e) 
{ 
    System.Console.WriteLine(e); 
} 

這當在同一臺機器上運行工作正常,但是當在不同的機器上運行引發以下錯誤:

System.Net.Sockets.SocketException (0x80004005): A socket operation was attempte 
d to an unreachable network 169.254.171.86:9932 
    Exit 
Server stack trace: 
    at System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot, SocketAddre 
ss socketAddress) 
    at System.Net.Sockets.Socket.Connect(EndPoint remoteEP) 
    at System.Runtime.Remoting.Channels.RemoteConnection.CreateNewSocket(EndPoint 
ipEndPoint) 
    at System.Runtime.Remoting.Channels.RemoteConnection.CreateNewSocket() 
    at System.Runtime.Remoting.Channels.RemoteConnection.GetSocket() 
    at System.Runtime.Remoting.Channels.SocketCache.GetSocket(String machinePortA 
ndSid, Boolean openNew) 
    at System.Runtime.Remoting.Channels.Tcp.TcpClientTransportSink.SendRequestWit 
hRetry(IMessage msg, ITransportHeaders requestHeaders, Stream requestStream) 
    at System.Runtime.Remoting.Channels.Tcp.TcpClientTransportSink.ProcessMessage 
(IMessage msg, ITransportHeaders requestHeaders, Stream requestStream, ITranspor 
tHeaders& responseHeaders, Stream& responseStream) 
    at System.Runtime.Remoting.Channels.BinaryClientFormatterSink.SyncProcessMess 
age(IMessage msg) 

Exception rethrown at [0]: 
    at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage req 
Msg, IMessage retMsg) 
    at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgDa 
ta, Int32 type) 
    at JackOfTrades.Common.Table.GetTableData(Boolean full) 

望着上方,有是我無法識別的IP地址,它既不在網絡中,也不在路由器的IP中。

有什麼想法是什麼錯?幫助將不勝感激!

+0

的IP:'169.254.171.86'看起來像自動配置的IP地址,這通常是從一個網絡適配器的結果(例如二次適配器),該ISN的窗戶沒有連接到網絡。代碼中是否存在您試圖發現本地計算機的IP地址的地方,並且可能沒有具體說明您獲取地址的適配器? – CodingGorilla 2010-11-09 14:33:02

回答

3

您需要設置TcpServerChannel具有下列參數:

bindTo
指定網絡接口卡(NIC)到服務器通道應該綁定的IP地址的字符串。默認值是System.Net.IPAddress.Any。

http://msdn.microsoft.com/en-us/library/bb397831.aspx

更新:

IDictionary properties = new Hashtable(); 
properties["port"] = 9932; 
properties["bindTo"] = "192.168.1.141"; 
TcpServerChannel channel = new TcpServerChannel(properties, null); 
ChannelServices.RegisterChannel(channel, false); 
+0

我正在研究這個,我似乎無法弄清楚如何在TcpServerChannel中使用bindTo。任何顯示如何的資源?它似乎不是一個可用的選項。 – achinda99 2010-11-09 15:22:53

+0

謝謝,這完全解決了問題。 – achinda99 2010-11-09 16:52:46

1

當網絡適配器無法獲得DHCP地址時,通常會看到168.254.x.x地址。

我會檢查以確保您正在運行此代碼的機器具有有效的IP地址。

+0

那麼,我正在家庭網絡上測試這個,路由器提供了192.168.1.x的IP地址。並且正在配置文件中使用正確的IP地址來創建連接。我不知道168.254.x.x是從哪裏撤出的。 – achinda99 2010-11-09 15:04:03

相關問題