有没有办法规定Win32 WinSock WSAIoctl
函数的SIO_GET_INTERFACE_LIST
功能返回的网络接口的顺序?
背景:
我们有一个异构的CORBA系统,其中在Windows上运行ACE / TAO CORBA实现的名称服务具有向其注册的基于ACE / TAO的服务,使用IIOP.NET CORBA实现实现的客户端需要使用。基于IIOP.NET的客户端位于单独的Windows计算机上。 ACE / TAO计算机有多个网络接口(客户端计算机只能访问其中一个),因此有多个IP地址。
IIOP.NET客户端可以连接到nameservice并检索它需要使用的注册服务器CORBA对象的代理,但是当它尝试使用代理时会抛出异常。
基于花费太多时间进行调试,我们得出结论,问题是IIOP.NET只尝试连接到CORBA IOR字符串中的第一个IP地址,名称服务在被要求返回时返回服务。 IOR字符串是对象的描述,包括其IP地址。大多数CORBA客户端将尝试使用IOR字符串中的所有地址与服务器对象连接,但看起来IIOP.NET不会这样做。
生成IOR字符串的ACE / TAO代码使用带控制代码WSAIoctl
的WinSock SIO_GET_INTERFACE_LIST
命令返回框中的网络接口列表,然后将它们全部添加到IOR字符串。问题是第一个IP地址是IIOP客户端使用的不在网络上的IP地址,因此当IIOP.NET客户端尝试使用该IP地址连接到服务器对象时,它显然会失败并且从不尝试使用正确的IP地址。其他CORBA客户端(如ACE / TAO)会尝试所有IP地址,并且它们可以在此配置中工作。
由于我不是网络/ CORBA之神,我试图改变ACE / TAO或IIOP.NET是不现实的,我们有充分的理由在这个系统中有两个独立的网络,但如果是第一个,WSAIOCtl
返回的默认IP地址是客户端需要的IP地址,这将解决问题,因为该IP地址将成为IOR字符串中的第一个IP地址,IIOP.NET将成功使用该IP地址。那么,是否有一种可靠的方法可以使WSAIoctl
以不同的顺序返回网络接口?遗憾的是,我没有在MSDN上看到任何记录。
谢谢,
戴夫
答案 0 :(得分:1)
我找到了解决方案,我提供了答案,以防其他任何人反对这一点。 ACE / TAO orb有一个命令行参数,可以覆盖WSAIoctl
返回的结果。命令行参数为-ORBListenEndpoints
,它允许您提供以分号分隔的主机名和IP地址列表。 Google -ORBListenEndpoints
,您将找到确切的语法。使用接收该命令行参数的ORB初始化的任何服务器都将侦听指定的端点。我已经测试了这个并且它可以工作。