.Net Remoting:指出使用哪个本地接口连接到一个服务器

问题描述:

我们有一个服务器,我们用.Net远程连接。.Net Remoting:指出使用哪个本地接口连接到一个服务器

服务器在两个网络上,客户端在两个网络上。客户端和服务器只有一个共同的网络: enter image description here

使用发现,我们找到服务器的IP(在本例中为10.10.10.110)。我们创建了TcpChannel,我们连接到服务器。

服务器收到呼叫,但是当它试图发送一些信息给客户端接收器时。我们得到一个例外,说我们试图发送数据到一个不可升级的IP(10.12.10.100)。

因此,服务器正确地宣布他的地址,但我们如何指示客户端使用具有特定IP的网络接口?

一些代码:

客户端,初始化:

IDictionary tcpChannelConfiguration = new Hashtable(); 
string instanceName = "RemotingClient" + Utils.GenerateRandomString(5); 
tcpChannelConfiguration["name"] = instanceName); 
tcpChannelConfiguration["port"] = 0; 
tcpChannelConfiguration["machineName"] = m_interfaceToHost;//This is containing the local interface to use 
tcpChannelConfiguration["bindTo"] = m_interfaceToHost; 
IClientChannelSinkProvider formatClient = new BinaryClientFormatterSinkProvider(tcpChannelConfiguration, null); 
IClientChannelSinkProvider identityFormatClient = new IdentityClientSinkProvider{Next = formatClient}; 
BinaryServerFormatterSinkProvider formatServer = new BinaryServerFormatterSinkProvider(tcpChannelConfiguration, null) 
{TypeFilterLevel = TypeFilterLevel.Full}; 
m_channel = new TcpChannel(tcpChannelConfiguration, identityFormatClient, formatServer); 
ChannelServices.RegisterChannel(m_channel, false); 

//Then we get the remote object: 
IServer server = (IServer)Activator.GetObject(typeof(IServer), String.Format("tcp://{0}:{1}/{2}", m_ipAddress, m_port, instanceName)); 
[...] 

下面是我在服务器端异常:

System.Net.Sockets.SocketException (0x80004005): A socket operation was attempted to an unreachable network 10.12.10.100:54330 

Server stack trace: 
    at System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot, SocketAddress 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 machinePortAndSid, Boolean openNew) 
    at System.Runtime.Remoting.Channels.Tcp.TcpClientTransportSink.SendRequestWithRetry(IMessage msg, ITransportHeaders requestHeaders, Stream requestStream) 
    at System.Runtime.Remoting.Channels.Tcp.TcpClientTransportSink.ProcessMessage(IMessage msg, ITransportHeaders requestHeaders, Stream requestStream, ITransportHeaders& responseHeaders, Stream& responseStream) 
    at System.Runtime.Remoting.Channels.BinaryClientFormatterSink.SyncProcessMessage(IMessage msg) 

我怎么能指示客户端的IP /它必须提供给服务器的接口?

这是我们可以通过给自定义ClientSinkProvider吗?

编辑

我发现了一些可能被interessting,我注意到,对于简单的查询和响应,在.NET远程工作正常,但对于其中的一些,查询给出了一个对象,这将是用作服务的回调,在这种情况下,它不起作用。

我刚刚得到.Net的源代码来检查这是如何完成的,但是我没有发现它是为相反方向创建的代理。

虽然拥有TcpChannel的源代码,但我发现在某些时候,服务器端(它将建立与客户端回调的连接)的方法接收到带有正确远程IP的请求但结尾的URI中有错误的IP: enter image description here

+0

您是否尝试添加'bindTo'设置? https://msdn.microsoft.com/en-us/library/ms973907.aspx – rene

+0

@rene是的,但作为spec状态:“此属性只能在服务器端使用。” – J4N

+0

好吧,这可能有点破解,但如何在服务器上添加路由到路由表以便为该IP使用特定的NIC?仅用于测试来验证它只是一个路由问题。 – rene

几年前,我写了一对远程应用程序,即使没有得到这个确切的错误,我的理解是服务器试图返回结果通过连接回客户端,但然后使用错误的IP。

如果您明确指定客户端将用于与服务器通信的IP,会发生什么情况?尝试添加下面给您的客户config文件:

<configuration> 
    <system.runtime.remoting> 
     <application> 
      <channels> 
       <channel ref="tcp" port="0" bindTo="10.10.10.100" /> 
      </channels> 
     </application> 
    </system.runtime.remoting> 
</configuration> 

这应确保连接和流量是通过请求的IP路由 - 而不是通过10.12.10.100连接[这可能accually如果网络工作有一些意思是要达到10.11.xx而不通过10.10.xx]。

+0

我们的配置是不幸的是在代码中(而不是XML),但我们试图将'bindTo'和'machineName'设置为期望的IP,但它仍然不起作用:(我更新了示例以显示我们如何做到了这一点 – J4N

+0

我明白了。也许你可以尝试改变Windows中的网卡顺序,让系统先尝试使用正确的网络?像这样:https://www.google.se/search?q=nic+order+windows&rlz=1CDGOYI_enSE595SE595&hl=en-GB&prmd=ivn&source=lnms&tbm=isch&sa=X&ved=0ahUKEwj52LyF96jQAhUGFiwKHat-B​​hkQ_AUIBygB&biw=414&bih=660 –

+0

是的,我们只是试图那昨天,它没有帮助,我们一旦获得成功,但是再次失败(并且恢复这个返回具有相同的行为)。 – J4N

我们最终得到了TcpChannel的代码,基本上,我们存储了存储在头文件中的源IP地址,然后我们替换了我们在IChannelDataStore中拥有的URI。我们还确保客户端使用相同的端口监听每个地址。一种黑客,但它让我们摆脱困境...

+0

对于所有这些都是神圣的!! ......很高兴你终于通过了它! :) –

重新排序网络连接优先级在我的情况帮助。

http://ecross.mvps.org/howto/change-network-connection-priority-in-windows-10.htm

  1. 按Windows键+ X,从菜单中选择网络连接。
  2. 按下ALT键,点击高级,然后点击高级设置。
  3. 选择网络连接并单击箭头以优先考虑网络连接。

enter image description here

  1. 单击确定,当您完成组织网络连接的优先级。当连接可用时,计算机现在将遵循命令。
开始=>