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

2023-12-28

我们有一个通过 .Net 远程处理连接的服务器。

The server is on two network, the client is on two network. The client and the server have only one network in common: 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?

Edit

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

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

While having the source code of the TcpChannel, I see that at some point, the method, on the server side(which will establish a connection to the callback on the client) receives the request with the correct remote IP in the header, but ends by having the wrong IP in the URI: enter image description here


几年前我编写了几个远程应用程序,尽管我没有得到这个确切的错误,但我的理解是服务器尝试通过连接回客户端来返回结果,但随后使用了错误的 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 进行连接 [如果该网络有某种方法可以在不传递 10.10.x.x 的情况下到达 10.11.x.x,则这可能确实有效]。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

.Net Remoting:指示使用哪个本地接口连接到一台服务器 的相关文章

  • Grpc - 将消息从一个客户端发送到连接到同一服务器的另一个客户端

    是否可以将消息从一个客户端发送到连接到同一服务器的另一个客户端 我想将数据从一个客户端发送到服务器然后发送到特定客户端 我想我需要获取客户端 ID 但我不知道如何获取此 ID 以及如何从服务器将此消息发送到该客户端 我这里有一个样本 这是一
  • 打印“X”个字符数与“X”字符串长度的所有可能组合(暴力破解)

    我正在尝试编写一个单词组合生成器 我的意思是打印 X 个字符数与 X 字符串长度的所有可能组合 首先 我需要说的是 我在 StackOverFlow 中看到了一个关于这个问题的问题 其中有很多单词生成器的答案来执行此操作 在不同的语言上 但
  • 传递 constexpr 对象

    我决定给予新的C 14的定义constexpr旋转并充分利用它 我决定编写一个小的编译时字符串解析器 然而 我正在努力保持我的对象constexpr将其传递给函数时 考虑以下代码 include
  • 无法注册时间触发的后台任务

    对于 Windows 8 应用程序 在 C Xaml 中 我尝试注册后台任务 很难说 但我想我的后台任务已正确注册 但是当我单击调试位置工具栏上的后台任务名称时 我的应用程序停止工作 没有任何消息 我查看了事件查看器上的日志 得到 具有入口
  • extern 声明和函数定义都在同一文件中

    我只是浏览了一下gcc源文件 在gcc c 我发现了类似的东西 extern int main int char int main int argc char argv 现在我的疑问是extern是告诉编译器特定的函数不在这个文件中 但可以
  • 强制初始化模板类的静态数据成员

    关于模板类的静态数据成员未初始化存在一些问题 不幸的是 这些都没有能够帮助我解决我的具体问题的答案 我有一个模板类 它有一个静态数据成员 必须为特定类型显式实例化 即必须专门化 如果不是这种情况 使用不同的模板函数应该会导致链接器错误 这是
  • cpp.react库的C++源代码中奇怪的“->* []”表达式

    这是我在文档中找到的 C 片段cpp react 库 https github com schlangster cpp react implicit parallelism auto in D MakeVar 0 auto op1 in g
  • 语音识别编程问题入门

    所以 你们可能都看过 钢铁侠 其中托尼与一个名为贾维斯的人工智能系统进行交互 演示剪辑here http www youtube com watch v Go8zsh1Ev6Y 抱歉 这是广告 我非常熟悉 C C 和 Visual Basi
  • 如何在 C# Designer.cs 代码中使用常量字符串?

    如何在 designer cs 文件中引用常量字符串 一个直接的答案是在我的 cs 文件中创建一个私有字符串变量 然后编辑 Designer cs 文件以使用此变量 而不是对字符串进行硬编码 但设计者不喜欢这样抛出错误 我明白为什么这行不通
  • 什么是空终止字符串?

    它与什么不同标准 字符串 http www cplusplus com reference string string 字符串 实际上只是一个数组chars 空终止字符串是指其中包含空字符的字符串 0 标记字符串的结尾 不一定是数组的结尾
  • 在 .NET MAUI 中实现 TouchTracking

    我一直致力于将我们的应用程序从 Xamarin Forms 迁移到 NET MAUI 我们的应用程序几乎没有绘图功能 用户可以用手指进行绘图 我们用了TouchTrackingXamarin Forms 中的 nuget 包 但与 NET
  • 将二变量 std::function 转换为单变量 std::function

    我有一个函数 它获取两个值 x 和 y 并返回结果 std function lt double double double gt mult double x double y return x y 现在我想得到一个常量 y 的单变量函数
  • Oauth2中如何同时撤销RefreshToken和使AccessToken失效

    我正在使用 Owin Oauth2 授权和资源服务器相同 开发单页面应用程序 AngularJS Net MVC Json Rest API 的身份验证流程 我选择了 Bearer Token 路由而不是传统的 cookie session
  • 比较:接口方法、虚方法、抽象方法

    它们各自的优点和缺点是什么 接口方法 虚拟方法 抽象方法 什么时候应该选择什么 做出这一决定时应牢记哪些要点 虚拟和抽象几乎是一样的 虚方法在基类中有一个实现 可以选择重写 而抽象方法则没有 并且must在子类中被覆盖 否则它们是相同的 在
  • 模板类中的无效数据类型生成编译时错误?

    我正在使用 C 创建一个字符串类 我希望该类仅接受数据类型 char 和 wchar t 并且我希望编译器在编译时使用 error 捕获任何无效数据类型 我不喜欢使用assert 我怎样才能做到这一点 您可以使用静态断言 促进提供一个 ht
  • Visual Studio 2015:v120 与 v140?

    仅供参考 Win10 x64 我今天开始尝试 Visual Studio 2015 在弄清楚如何运行 C C 部分后 我尝试加载一个大型个人项目 该项目使用非官方的glsdk http glsdk sourceforge net docs
  • WPF DataGrid / ListView 绑定到数组 mvvm

    我们假设你有 N 个整数的数组 表示行数的整数值 在模型中 该整数绑定到视图中的 ComboBox Q1 如何将数组 或数组的各个项目 绑定到 DataGrid 或 ListView 控件 以便 当您更改 ComboBox 值时 只有那么多
  • 没有“对 *this”功能的右值引用的解决方法

    我有一个围绕可移动对象的代理容器类 并希望代理能够隐式生成对底层对象的右值引用 但仅当代理本身被移动时 我相信我将能够按照提案 n2439 实施此行为 将移动语义扩展到 this http www open std org jtc1 sc2
  • 为什么空循环使用如此多的处理器时间?

    如果我的代码中有一个空的 while 循环 例如 while true 它将把处理器的使用率提高到大约 25 但是 如果我执行以下操作 while true Sleep 1 它只会使用大约1 那么这是为什么呢 更新 感谢所有精彩的回复 但我
  • 在 System.Type 上使用条件断点时出错

    这是函数 public void Init System Type Type this Type Type BuildFieldAttributes BuildDataColumns FieldAttributes 我在第一行设置了一个断点

随机推荐

  • 修复共享元素过渡动画显示不佳的问题

    我正在尝试在两个具有共享元素的活动之间创建共享元素过渡动画ImageView 第一个有一个RecyclerView使用项目单击侦听器 单击后 它应该通过转换启动另一个活动 关闭已启动的活动时动画效果良好 但启动活动时则不然 点击该项目后Re
  • 使用 Spring Security + CAS 进行循环重定向,但应该可以工作

    我正在尝试将基本应用程序从仅使用 Spring Security 更改为使用 CAS 以启用 SSO 但我在某个地方遇到了重定向循环 并且我无法找出问题所在 我还制作了另外两个模拟应用程序 在 CAS 上没有问题 因为它们正在工作 我使用
  • 将灰度转换为黑白的最佳阈值

    自动找出将灰度图像转换为黑白图像的最佳阈值的最佳方法是什么 我可以手动计算出相当好的阈值 但我想自动选择阈值 编辑 我已经阅读了一些有关这个问题的内容 通过查看图像的直方图可以有所帮助 例如如果图像具有双模态直方图 那么在模式之间选择阈值似
  • 以编程方式应用于按钮时,样式无法完全工作[重复]

    这个问题在这里已经有答案了 这是我的风格
  • 会话 VS 温度饼干

    我是在想 在 PHP 中设置没有过期的 cookie 意味着它会在浏览器关闭时过期 和设置会话变量有什么区别 我不是在谈论登录之类的事情 而不需要在每次页面访问时获取不经常更改的数据库值等 P S 您可以通过使用来更好地保护您的cookie
  • 如何在 Angular 中使用“routerLink”启用“ctrl+click”

    在 Angular 中 如果你使用这个 div img src div 当我按图像时 它会完美路由 我想按 ctrl 单击 在新选项卡中打开此链接 或将此图像拖动到新选项卡 但是当我按 ctrl 单击 时 它会在同一页面中打开 如果我拖动它
  • CSS 依赖于 ActiveX?

    只要启用了 ActiveX 我的页面就可以在 FF Chrome Safari 甚至 IE8 中运行 链接已删除 为了让 CSS3 功能 旋转 不透明度 文本阴影 在 IE8 中工作 我必须使用 ActiveX 过滤器 我的问题是 当您第一
  • Android - 通过服务器端验证保护应用内购买

    我是 Android 开发新手 但创建了一个应用程序 并实现了应用程序内购买以从应用程序中删除广告 我只是做了一个非常基本的实现 我基本上检查用户是否购买了 no ads 项目 如果是真的 则不会显示广告 问题是我看到很多 购买 记录在 f
  • Eclipse 无法通过代理连接到互联网

    我的 eclipse juno 4 2 centos 5 6 无法连接到互联网 完全没有 我有一个代理服务器设置 我看了一下Eclipse 无法连接到互联网 https stackoverflow com questions 7778484
  • NetworkX 从特定节点删除属性

    我在使用 python 中的 networkX 库时遇到问题 我建立了一个图表 用属性初始化一些节点 边 我还开发了一种方法 可以动态地将具有特定值的特定属性添加到目标节点 例如 def add tag self G fnode attr
  • 带 bo​​ost 的 C++11 占位符

    这段代码 int main using namespace std placeholders ClassA a ClassB b b2 a SigA connect std bind ClassB PrintFoo b a SigB con
  • Android 蓝牙 - 如何启动配对

    我想向非 Android 设备发起配对请求 此时不是连接 这可以在 设置应用程序 gt 网络 gt 蓝牙设置 gt 扫描后单击设备 中找到 两台设备上都会出现一个带有 6 位 PIN 码的弹出窗口 根据 Android 的文档 如果我这样做
  • 如何在 Go 中访问 Kubernetes API 并运行 kubectl 命令

    我想在 Go 中访问我的 Kubernetes 集群 API 来运行kubectl命令获取在谷歌云上运行的 k8s 集群中的可用命名空间 我的唯一目的是通过运行来获取集群中可用的命名空间kubectl命令 请告诉我是否有其他选择 你可以从k
  • 如何从cookie中获取Web Session?

    我正在尝试抓取网页 但为了发布数据 我需要一个网络会话 ID 例如 web session HQJ3G1GPAAHRZGFR 我怎样才能得到那个ID 到目前为止我的代码是 Private Sub test Dim postData As S
  • “my_app.app/ResearchKit/ResearchKit/Info.plist”处的捆绑包不包含捆绑包可执行文件

    UpdateXCode 版本 8 2 iOS 目标 9 希望有人能向我指出这不是一个错误 非常简单 我提取了最新稳定版本的 researckKit 然后将 xcodeproj 文件放入我的新 iOS 项目中 添加了嵌入式二进制文件 我创建了
  • 为什么 std::cin 字符串输入要求我输入每个空格

    这周我开始研究 C 中的文本文件 在练习中我必须编写一个程序 让用户在文件中输入行 但是 对于用户输入的每个空格 程序都会向用户询问新的空格 这是我的代码 include
  • Android 无法恢复密钥

    我在 Android Studio 中恢复密钥时出错 我知道密钥别名 并且拥有两者的正确密码 我知道这一点是因为我能够运行 keytool list v keystore mykeystore jks alias myKey storepa
  • Rhandsontable 条件格式 - 如何根据特定属性值突出显示行?

    我想根据值对整行应用颜色突出显示 并保留 rhandsontable 的复选框功能 在下面的简单示例中 我希望第 3 行为粉色 第 4 行为绿色 library rhandsontable DF data frame bool TRUE v
  • Java 重载和覆盖

    我们总是说方法重载是静态多态 重写是运行时多态 这里的静态到底是什么意思 对方法的调用是否在编译代码时解析 那么普通方法调用和调用final方法有什么区别呢 编译时链接的是哪一个 方法重载意味着根据输入创建函数的多个版本 例如 public
  • .Net Remoting:指示使用哪个本地接口连接到一台服务器

    我们有一个通过 Net 远程处理连接的服务器 The server is on two network the client is on two network The client and the server have only one