对于我们正在开发的项目,我们使用.NET远程处理在服务器和客户端之间进行通信。到目前为止,我们一直在使用localhost和一个任意端口号在同一台机器上进行测试。但是,在同一网络上的两台计算机之间进行测试时,主要组件可以正常工作,但代理对象会失败。
我们正在使用配置文件来设置服务器名称和端口,如下所示:
<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 :(得分:4)
您需要使用以下参数设置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);
答案 1 :(得分:1)
当网络适配器无法获取DHCP地址时,通常会看到168.254.x.x地址。
我会检查以确保您运行此代码的计算机具有有效的IP地址。