代码之家  ›  专栏  ›  技术社区  ›  achinda99

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

  •  2
  • achinda99  · 技术社区  · 14 年前

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

    <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);
    

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

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

    2 回复  |  直到 14 年前
        1
  •  4
  •   QrystaL    14 年前

    您需要使用以下参数设置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);
    
        2
  •  1
  •   Moose    14 年前

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