【问题标题】:Socket error when .NET remoting between two machines在两台机器之间进行 .NET 远程处理时的套接字错误
【发布时间】:2010-11-09 14:27:25
【问题描述】:

对于我们正在进行的项目,我们使用 .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。

有什么想法吗?非常感谢您的帮助!

【问题讨论】:

  • IP:169.254.171.86 看起来像一个 Windows 自动配置的 IP 地址,通常是由未连接到网络的网络适配器(如辅助适配器)产生的。代码中是否存在您试图发现本地机器的 IP 地址并且可能没有具体说明您要获取地址的适配器的地方?

标签: c# .net sockets remoting remoteobject


【解决方案1】:

您需要使用以下参数设置 TcpServerChannel:

绑定到
一个字符串,它指定服务器通道应绑定到的网络接口卡 (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);

【讨论】:

  • 我正在研究这个,但我似乎无法弄清楚如何在 TcpServerChannel 中使用 bindTo。任何显示如何的资源?这似乎不是一个可用的选项。
【解决方案2】:

当网络适配器无法获取 DHCP 地址时,通常会看到 168.254.x.x 地址。

我会检查以确保您运行此代码的机器具有有效的 IP 地址。

【讨论】:

  • 好吧,我在家庭网络上测试这个,路由器提供 192.168.1.x IP。并且在配置文件中使用了正确的 IP 地址来创建连接。我不确定 168.254.x.x 是从哪里拉出来的。
猜你喜欢
  • 2010-11-29
  • 2019-03-29
  • 2011-07-25
  • 1970-01-01
  • 2012-07-06
  • 1970-01-01
  • 1970-01-01
  • 2013-05-15
  • 1970-01-01
相关资源
最近更新 更多