2009-07-28 18 views
1

En bref: Comment découvrir de manière fiable un serveur exécutant quelque part sur un (probablement multisegment) réseau local avec zéro configuration clientCréer Windows (win32) Service découvrable à travers le réseau

Mon application cliente doit localiser l'application serveur sans connaître l'adresse IP du serveur. Il doit fonctionner sur un LAN local qui peut être divisé en segments avec des concentrateurs ou d'autres dispositifs de commutation.

J'ai déjà une solution de travail, mais c'est un peu compliqué de l'utiliser sur des réseaux multi-segments. Cela fonctionne comme suit:

Lorsque le client démarre, il envoie des diffusions UDP sur son propre segment de réseau. Si le serveur fonctionne sur le même segment, cela fonctionne sans problèmes - le serveur répond avec les messages appropriés. Si le serveur et le client s'exécutent sur des réseaux séparés par un concentrateur/commutateur qui ne transmettra pas UDP (le cas le plus probable), une instance de serveur est en cours d'exécution sur chaque segment et transmet les demandes des clients à chaque autre via TCP - mais j'ai besoin de configurer cela pour les instances de serveur (simple, mais toujours une douleur pour le support technique.) C'est le problème principal que je dois résoudre. Il y a des sites où nous avons des centaines de clients fonctionnant sur 5 ou 6 segments distincts. Les problèmes auxquels je suis confronté: 1. Bien que mon programme d'installation de l'application active les ports appropriés sur le pare-feu, parfois je rencontre des situations où cela ne semble pas se produire correctement. 2. Doit exécuter plusieurs instances de serveur (et donc les configurer et les maintenir) sur des réseaux concentrateurs/commutés qui ne transmettront pas UDP

Enfin, j'ai besoin d'une solution qui fonctionnera sans maintenance sur un réseau Windows minimal (XP/2000/Vista) qui n'a probablement pas Active Directory ou d'autres services de recherche configurés.

Je ne veux taguer aucun élément d'exécution pour cela - devrait être capable de le faire avec VC++ ou Delphi.

Quelles approches les applications commerciales utilisent-elles habituellement? Je sais que SQL Server utilise une combinaison d'appels broadcast et NetBEUI (je peux me tromper à ce sujet).

Merci d'avance.

+0

peut-être y a-t-il un indice sur comment faire cela sur upnp.org? – djangofan

Répondre

1

Vous avez quelques questions de terminologie:

  • Si vous dites « segment de réseau » vous semblez dire « sous-réseau IP ». Les appareils sur le même segment de réseau peuvent voir les mêmes diffusions IP.
  • Où vous dites "concentrateur/commutateur" vous semblez dire "routeur IP".
  • Lorsque vous dites "ne transmettra pas UDP", le problème est en fait "ne transmettra pas les diffusions IP".

Une fois que nous obtenons passé, vous avez quelques options:

  • Vos serveurs peuvent se faire enregistrer sous un nom bien connu dans le DNS, si vous avez un serveur DNS qui permet des mises à jour DNS dynamiques. Vous devriez probablement utiliser un enregistrement SRV comme spécifié dans RFC2782. Les clients effectuent ensuite une recherche DNS pour trouver le (s) serveur (s).
  • Vous pouvez assigner de façon statique vos noms de serveur (s) bien connus dans le DNS de l'organisation, peut-être avec un enregistrement SRV comme avec l'option précédente.
  • Vos serveurs peuvent rejoindre un groupe de multidiffusion IP si vos routeurs prennent en charge la multidiffusion IP. Les clients envoient ensuite leur demande de découverte initiale en tant que paquet UDP à l'adresse de multidiffusion (pré-ordonnée).
+0

Je suppose que vous avez raison sur la terminologie mélangée, merci de me corriger :-). Multicast est quelque chose que je pensais mais n'était pas sûr que cela fonctionnerait. Je suppose que ce serait la meilleure option. Je dois essayer quand même. –

0

Si vous avez un serveur de domaine, j'irais avec un petit service dessus. Vous pouvez vous connecter avec d'autres services et l'utiliser comme point de distribution.

Pourquoi le serveur de domaine? Il est relativement facile de trouver son nom (DsGetDcName).

D'autres choix incluent un serveur DHCP, un serveur DNS ou quelque chose de ce genre qui doit être rempli par le personnel de maintenance de toute façon.

+0

Pas de serveur de domaine non plus. J'aurais dû le mentionner dans la question. Cela devrait fonctionner sur un groupe de travail. –