C# 在两台计算机之间进行.NET远程处理时发生套接字错误

C# 在两台计算机之间进行.NET远程处理时发生套接字错误,c#,.net,sockets,remoting,remoteobject,C#,.net,Sockets,Remoting,Remoteobject,对于我们正在进行的项目,我们使用.NET远程处理在服务器和客户端之间进行通信。到目前为止,我们已经在同一台机器上测试了它,并使用localhost和任意端口号测试了它的性能。但是,在同一网络上的两台计算机之间进行测试时,使用,主组件工作,但代理对象失败 我们使用配置文件设置服务器名称和端口,如下所示: <setting name="ServerName" serializeAs="String"> <value>192.168.1.141</value>

对于我们正在进行的项目,我们使用.NET远程处理在服务器和客户端之间进行通信。到目前为止,我们已经在同一台机器上测试了它,并使用localhost和任意端口号测试了它的性能。但是,在同一网络上的两台计算机之间进行测试时,使用,主组件工作,但代理对象失败

我们使用配置文件设置服务器名称和端口,如下所示:

<setting name="ServerName" serializeAs="String">
    <value>192.168.1.141</value>
</setting>
<setting name="Port" serializeAs="String">
    <value>9932</value>
</setting>
这很好,我们可以调用lobble对象上的方法。但是,在代码的后面,我们返回另一个对象,如下表所示:

_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);
其中,Lobble_proxy与前面代码中的Lobble对象相同。服务器的配置方式如下:

_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上


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

168.254.x.x地址通常在网络适配器无法获取DHCP地址时出现


我将检查以确保运行此代码的计算机具有有效的IP地址。

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

bindTo
一个字符串,指定服务器通道应绑定到的网络接口卡(NIC)的IP地址。默认值为System.Net.IPAddress.Any

更新:

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

IP:
169.254.171.86
看起来像是windows自动配置的IP地址,通常由未连接到网络的网络适配器(如辅助适配器)生成。代码中是否有某个地方您试图发现本地计算机的IP地址,但可能没有具体说明您要为哪个适配器获取地址?我正在家庭网络上测试这一点,路由器提供192.168.1.x IP。配置文件中使用了正确的IP地址来创建连接。我不确定168.254.x.x是从哪里来的。我一直在研究这个问题,似乎不知道如何在TcpServerChannel中使用bindTo。有什么资源可以证明这一点吗?这似乎不是一个可行的选择。