Как изменить порядок сетевых интерфейсов, возвращаемых WSAIoctl, с помощью управляющего кода SIO_GET_INTERFACE_LIST
Вопрос
Есть ли способ диктовать порядок сетевых интерфейсов, возвращаемых Win32 WinSock WSAIoctl
функция SIO_GET_INTERFACE_LIST
функциональность?
Предыстория:
У нас есть разнородная система CORBA, в которой служба имен, выполняющая реализацию ACE / TAO CORBA в Windows, имеет зарегистрированные в ней службы на основе ACE / TAO, которые клиенты внедрили с помощью IIOP.Необходимо использовать реализацию NET CORBA.Клиенты на базе IIOP.NET находятся на отдельном компьютере с Windows.Компьютер ACE / TAO имеет несколько сетевых интерфейсов (только один из которых доступен клиентскому компьютеру) и, следовательно, несколько IP-адресов.
IIOP.СЕТЕВОЙ клиент может подключиться к службе имен и получить прокси-сервер для объекта CORBA зарегистрированного сервера, который ему необходимо использовать, но когда он пытается использовать прокси-сервер, он выдает исключения.
Основываясь на слишком большом количестве времени, потраченного на отладку, мы пришли к выводу, что проблема заключается в том, что IIOP.NET пытается подключиться только к первому IP-адресу в строке CORBA IOR, который служба имен возвращает при запросе услуги.Строка IOR - это описание объекта, включая его IP-адреса.Большинство клиентов CORBA попытаются подключиться к объекту server, используя все адреса в строке IOR, но это выглядит как IIOP.NET этого не делает.
Код ACE / TAO, который генерирует строку IOR, использует WinSock WSAIoctl
команда с управляющим кодом SIO_GET_INTERFACE_LIST
чтобы вернуть список сетевых интерфейсов в поле, а затем добавить их все в строку IOR.Проблема в том, что первый IP-адрес - это тот, которого нет в сети, используемой клиентом IIOP, поэтому, когда IIOP.СЕТЕВОЙ клиент пытается подключиться к объекту сервера, используя этот IP-адрес, очевидно, что он терпит неудачу и никогда не пытается использовать правильный IP-адрес.Другие клиенты CORBA, такие как ACE / TAO, пробуют все IP-адреса, и они работают в этой конфигурации.
Поскольку я не являюсь богом сетевого взаимодействия / CORBA, для меня нереально пытаться изменить ACE / TAO или IIOP.NET , и у нас есть веские причины иметь две разделенные сети в этой системе, но если первый IP-адрес по умолчанию, возвращенный WSAIOCtl
если бы клиент нуждался в таком адресе, это решило бы проблему, поскольку этот IP-адрес тогда стал бы первым IP-адресом в строке ввода-вывода и IIOP.СЕТЬ успешно использовала бы этот IP-адрес.Итак, есть ли надежный способ вызвать WSAIoctl
возвращать сетевые интерфейсы в другом порядке?К сожалению, я не вижу в MSDN ничего документированного по этому поводу.
Спасибо,
Дэйв
Решение
Я нашел решение, и я предоставляю ответ на случай, если кто-то еще столкнется с этим.У ACE / TAO orb есть параметр командной строки, который позволяет вам переопределять результаты, возвращаемые WSAIoctl
.Параметр командной строки равен -ORBListenEndpoints
и это позволяет вам предоставить список имен хостов и IP-адресов, разделенных точкой с запятой.Google -ORBListenEndpoints
и вы узнаете точный синтаксис.Любые серверы, инициализированные с помощью ORB, получающие этот параметр командной строки, будут прослушивать указанную конечную точку (конечные точки).Я протестировал это, и это работает.