gpt4 book ai didi

c# - 让 .net 远程支持 IP v4 和 v6 : how to get a stream mapped to a real ip, 不仅仅是一个参数异常

转载 作者:太空宇宙 更新时间:2023-11-03 14:29:22 25 4
gpt4 key购买 nike

我的公司有一个现有的 .Net Remoting 服务向外部进程公开接口(interface)。我通过以下 app.config 部分配置此服务以支持 IPv4 和 IPv6 通信:

  <system.runtime.remoting>
<application>
<service>
<wellknown mode="Singleton" type="type,
dll"objectUri="exposedname.rem" />
</service>
<channels>
<channel name="tcpclient" ref="tcp" encryption="EncryptAndSign">
<clientProviders>
<formatter ref="binary" />
</clientProviders>
</channel>
<channel ref="tcp" name="tcp6" port="9000" bindTo="[::]"
encryption="EncryptAndSign">
<clientProviders>
<formatter ref="binary" />
</clientProviders>
</channel>
<channel ref="tcp" name="tcp4" port="9000" bindTo="0.0.0.0"
encryption="EncryptAndSign">
<clientProviders>
<formatter ref="binary" />
</clientProviders>
</channel>
</channels>
</application>
<customErrors mode="off"/>
</system.runtime.remoting>

上面的配置文件部分获取远程服务响应 ip v4 和 ip v6 上的非流功能。但是,任何时候函数尝试发送或接收流时,都会抛出以下 ArgumentException:

  IPv4 address 0.0.0.0 and IPv6 address ::0 are unspecified addresses that
cannot be used as a target address.
Parameter name: hostNameOrAddress

有没有办法修改 app.config,使服务返回一个映射到真实 ip 的流,并且仍然支持 ip v4 和 ip v6?这在 .net 远程处理中是不可能的吗?

最佳答案

我对这个问题做了进一步的研究,并找到了使用 channel 属性“machineName”和“bindTo”解决我的显式问题的方法(请参阅底部的配置文件部分)。

在我的明确案例中,我不需要同时支持来自 ip v4 和 ip v6 的连接,因为通过配置,连接只会来自两个 ip 版本之一。因此,下面的配置部分仅详细介绍如何设置 .net 远程服务以通过 IPv6 进行完全通信。我相信这个配置修复可以让服务响应 ip v4 和 ip v6 通信,但是我没有测试过它所以我不确定。

使用 channel 属性“machineName”,服务被告知要将 api 返回的流对象绑定(bind)到哪个 ip 地址。这样,当客户端尝试访问流时,客户端不会获得未知地址 [::] 异常,而是获得配置为与服务器配置的 machineName 对话的流对象。

使用 channel 属性“bindTo”,服务被告知要监听传入通信的 IP 地址。这可以是一个明确的 ip,如下面的配置部分所示,也可以是一个完整的协议(protocol)('[::]' 用于 IPv6,'0.0.0.0' 用于 ip v4)。如果您不使用 ip v6,而只使用 ip v4,则仅当您希望将服务锁定到一个显式 ip 时才需要此属性。否则,由于 .Net 远程处理自动采用 ip v4,它将正常工作。

希望这对其他使用 ip v4/v6 的人有所帮助。

  <system.runtime.remoting>
<application>
<service>
<wellknown mode="Singleton" type="Kryptiq.Partners.Service.PartnersServiceApi, KPtnrSvc" objectUri="KPtnrSvc.rem" />
</service>
<channels>
<channel name="tcpclient" ref="tcp" encryption="EncryptAndSign"
machineName="[fe80::839:c79e:141a:2498%15]">
<clientProviders>
<formatter ref="binary" />
</clientProviders>
</channel>
<channel name="tcpserver" ref="tcp" port="2500" encryption="EncryptAndSign"
machineName="[fe80::839:c79e:141a:2498%15]"
bindTo="[fe80::839:c79e:141a:2498%15]">
<serverProviders>
<formatter ref="binary" />
</serverProviders>
</channel>
</channels>
</application>
</system.runtime.remoting>

关于c# - 让 .net 远程支持 IP v4 和 v6 : how to get a stream mapped to a real ip, 不仅仅是一个参数异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3001748/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com