.Net Remoting:指出使用哪个本地接口连接到一个服务器
我们有一个服务器,我们用.Net远程连接。.Net Remoting:指出使用哪个本地接口连接到一个服务器
服务器在两个网络上,客户端在两个网络上。客户端和服务器只有一个共同的网络:
使用发现,我们找到服务器的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:
几年前,我写了一对远程应用程序,即使没有得到这个确切的错误,我的理解是服务器试图返回结果通过连接回客户端,但然后使用错误的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]。
我们的配置是不幸的是在代码中(而不是XML),但我们试图将'bindTo'和'machineName'设置为期望的IP,但它仍然不起作用:(我更新了示例以显示我们如何做到了这一点 – J4N
我明白了。也许你可以尝试改变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-BhkQ_AUIBygB&biw=414&bih=660 –
是的,我们只是试图那昨天,它没有帮助,我们一旦获得成功,但是再次失败(并且恢复这个返回具有相同的行为)。 – J4N
我们最终得到了TcpChannel
的代码,基本上,我们存储了存储在头文件中的源IP地址,然后我们替换了我们在IChannelDataStore
中拥有的URI。我们还确保客户端使用相同的端口监听每个地址。一种黑客,但它让我们摆脱困境...
对于所有这些都是神圣的!! ......很高兴你终于通过了它! :) –
重新排序网络连接优先级在我的情况帮助。
http://ecross.mvps.org/howto/change-network-connection-priority-in-windows-10.htm
- 按Windows键+ X,从菜单中选择网络连接。
- 按下ALT键,点击高级,然后点击高级设置。
- 选择网络连接并单击箭头以优先考虑网络连接。
- 单击确定,当您完成组织网络连接的优先级。当连接可用时,计算机现在将遵循命令。
您是否尝试添加'bindTo'设置? https://msdn.microsoft.com/en-us/library/ms973907.aspx – rene
@rene是的,但作为spec状态:“此属性只能在服务器端使用。” – J4N
好吧,这可能有点破解,但如何在服务器上添加路由到路由表以便为该IP使用特定的NIC?仅用于测试来验证它只是一个路由问题。 – rene