c# - 在两台计算机之间进行 .NET 远程处理时出现套接字错误

标签 c# .net sockets remoting remoteobject

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

有什么问题吗?非常感谢您的帮助!

最佳答案

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

绑定(bind)到
指定服务器 channel 应绑定(bind)到的网络接口(interface)卡 (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);

关于c# - 在两台计算机之间进行 .NET 远程处理时出现套接字错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4134747/

相关文章:

sockets - 同时处理多个连接的最佳方法

Android:套接字客户端未从服务器接收消息

c# - 将 New tabPage 变成 New process

c# - 如何解决调用方法c#的库错误?

c# - 从构建输出运行单元测试

.NET WPF : Problems repeatedly calling WPF form from a WinForm application

.Net Web 引用 SSL 错误

.net - 如何找到我的 .Net 应用程序在何处泄漏 Windows 句柄?

javascript - 用于设置地址字段的复选框切换

c++ - 使用无效套接字调用 boost::asio::write() 使我的 Blackberry 10 应用程序崩溃