2009-12-16 4 views
1

Есть ли способ диктовать порядок сетевых интерфейсов, возвращаемых функциональностью функции функции Win32S WinSock SIO_GET_INTERFACE_LIST?Как перенастроить сетевые интерфейсы, возвращаемые WSAIoctl с помощью управляющего кода SIO_GET_INTERFACE_LIST

фона:

Мы получили гетерогенную систему CORBA, где запуск службы имен/реализации TAO CORBA ACE на Windows, имеет ACE/TAO на основе сервисов, зарегистрированных с ним, что клиенты реализованы с помощью реализации IIOP.NET CORBA необходимо использовать. Клиенты на базе IIOP.NET находятся на отдельной машине Windows. Машина ACE/TAO имеет несколько сетевых интерфейсов (только один из которых доступен клиентской машине) и, следовательно, несколько IP-адресов.

Клиент IIOP.NET может подключиться к службе имен и получить прокси-сервер для зарегистрированного объекта CORBA сервера, который ему нужно использовать, но когда он пытается использовать прокси-сервер, он выдает исключения.

Основываясь на слишком продолжительном времени отладки, мы пришли к выводу, что проблема в том, что IIOP.NET пытается только подключиться к первому IP-адресу в строке IOR CORBA, возвращаемой службой имени при запросе обслуживание. Строка IOR - это описание объекта, включая его IP-адрес (ы). Большинство клиентов CORBA попытаются соединиться с объектом сервера, используя все адреса в строке IOR, но похоже, что IIOP.NET этого не делает.

Код ACE/TAO, который генерирует строку IOR, использует команду WinSock WSAIoctl с управляющим кодом SIO_GET_INTERFACE_LIST, чтобы вернуть список сетевых интерфейсов в поле, а затем добавляет их все в строку IOR. Проблема заключается в том, что первый IP-адрес является тем, который отсутствует в сети, которую использует клиент IIOP, поэтому, когда клиент IIOP.NET пытается подключиться к объекту сервера с использованием этого IP-адреса, он явно не работает и никогда не пытается использовать правильный IP-адрес. Другие клиенты CORBA, такие как ACE/TAO, делают все IP-адреса и работают в этой конфигурации.

Поскольку я не являюсь сетью/божеством CORBA, для меня нереально пытаться изменить ACE/TAO или IIOP.NET, и у нас есть веские причины иметь две разделенные сети в этой системе, но если во-первых, IP-адрес по умолчанию, возвращенный WSAIOCtl, был тем, который нужен клиенту, который бы разрешил проблему, поскольку этот IP-адрес станет первым IP-адресом в строке IOR, и IIOP.NET будет успешно использовать этот IP-адрес. Итак, существует ли надежный способ вызвать WSAIoctl для возврата сетевых интерфейсов в другом порядке? К сожалению, я не вижу в документах на MSDN ничего подобного.

Спасибо,

Dave

ответ

1

Я нашел решение, и я обеспечиваю ответ в случае, если кто-то приходит против этого. ACE/TAO orb имеет параметр командной строки, который позволяет переопределять результаты, возвращаемые WSAIoctl. Параметр командной строки - -ORBListenEndpoints, и он позволяет вам предоставлять список имен узлов и IP-адресов с разделителями с запятой. Google -ORBListenEndpoints, и вы найдете точный синтаксис. Любые серверы, инициализированные с помощью ORB, принимающего этот параметр командной строки, будут прослушивать указанные конечные точки. Я тестировал это, и он работает.