2009-07-28 5 views
1

Вкратце: Как надежно обнаружить сервер, работающий где-то на (предположительно несколько сегментированной) локальной сеть с конфигурацией нулевого клиентаСоздать (win32) службу Windows, видимую через сеть

Моего Клиентское приложение должно найти серверное приложение, не зная IP-адрес сервера. Он должен работать в локальной локальной сети, которая может быть разделена на сегменты с концентраторами или другими коммутационными устройствами.

У меня уже есть рабочее решение, но это немного громоздко, чтобы заставить его работать в многосегментных сетях. Он работает следующим образом:

Когда клиент запускается, он отправляет широковещательные передачи UDP в свой собственный сегмент сети. Если сервер работает в одном сегменте, он работает без каких-либо проблем - сервер отвечает соответствующими сообщениями.

Если сервер и клиент работают в сетях, разделенных концентратором/коммутатором, которые не будут перенаправлять UDP (наиболее вероятный случай), то у меня есть экземпляр сервера, работающий на каждом сегменте, и они направляют запросы клиентов каждому другой через TCP - но мне нужно настроить это для экземпляров сервера (просто, но все же боль для технической поддержки). Это основная проблема, которую мне нужно решить. Есть сайты, где у нас есть сотни клиентов, работающих на 5 или 6 отдельных сегментах.

Проблемы, с которыми я столкнулся: 1. Хотя мой установщик приложений позволяет использовать соответствующие порты на брандмауэре, иногда я сталкиваюсь с ситуациями, когда это не происходит должным образом. 2. Необходимость запуска нескольких экземпляров сервера (и, следовательно, их настройка и поддержка) в сетях концентратора/коммутатора, которые не будут перенаправлять UDP

Наконец-то мне нужно решение, которое будет работать без обслуживания в минимальной сети Windows (XP/2000/Vista), который, вероятно, не имеет настроенных служб Active Directory или других служб поиска.

Я не хочу отмечать какие-либо материалы для выполнения для этого - должен быть в состоянии сделать это с помощью простого VC++ или Delphi.

Какие подходы обычно используются коммерческими приложениями? Я знаю, что SQL Server использует комбинацию широковещательных и NetBEUI-вызовов (возможно, я ошибаюсь).

Заранее спасибо.

+0

Возможно, есть намек на то, как это сделать на upnp.org? – djangofan

ответ

1

У вас есть несколько вопросов терминологии:

  • Где вы говорите «сегмент сети» вы появляетесь означает «IP-подсеть». Устройства в одном и том же сетевом сегменте могут видеть одни и те же IP-трансляции.
  • Где вы говорите «концентратор/коммутатор», вы видите «IP-маршрутизатор».
  • Где вы говорите «не будет пересылать UDP», проблема на самом деле «не будет передавать IP-трансляции».

После того, как мы заканчиваем, что у вас есть несколько вариантов:

  • Ваши серверы могут зарегистрировать себя под хорошо известным именем в DNS, если у вас есть сервер DNS, который позволяет динамического обновления DNS. Вероятно, вы должны использовать SRV-запись, указанную в RFC2782. Затем клиенты выполняют поиск DNS, чтобы найти сервер (ы).
  • Вы можете статически назначать имена ваших серверов в DNS организации, возможно, с записью SRV, как и с предыдущей опцией.
  • Ваши серверы могут присоединиться к группе многоадресной IP-сети, если ваши маршрутизаторы поддерживают многоадресную рассылку IP. Затем клиенты отправляют свой первоначальный запрос на открытие в виде UDP-пакета на (предварительно назначенный) многоадресный адрес.
+0

Я предполагаю, что вы правы насчет смешанной терминологии, спасибо за исправление меня :-). Многоадресная рассылка - это то, о чем я думал, но не уверен, что это сработает. Думаю, это лучший вариант. Придется попробовать, хотя. –

0

Если у вас есть сервер домена, я бы пошел с небольшим сервисом на него. Вы можете подключиться к другим сервисам и использовать его в качестве точки распространения.

Почему сервер домена? Относительно легко найти его имя (DsGetDcName).

Другие варианты включают DHCP-сервер, DNS-сервер или что-то в этом роде, которое должно быть заполнено обслуживающим персоналом.

+0

Нет сервера домена. Я должен был упомянуть об этом в вопросе. Он должен работать на рабочей группе. –

Смежные вопросы