Les Forums

Les Forums

Les forums sont fermés. Ils restent présent pour consultation et archivage.
Vous pouvez désormais poser vos questions directement dans les commentaires en bas de chaque page du site.
Alors n'hésitez pas à participer

Réseau sans serveur principal...

J'explique le contexte, pour que le titre ne paraisse pas que farfelu 😉 :

Je découvre les joies de TCP/UDP et des API Winsock2, soyez donc compréhensifs sur les lacunes ou les erreurs que vous allez découvrir dans mon explication.

Le problème auquel je suis confronté est relativement simple du point de vue des utilisateurs: Dans le cadre d'un spectacle, plusieurs techniciens doivent pouvoir échanger des données via un "réseau" constitué par des machines connectées dans n'importe quel ordre et pouvant communiquer avec toutes les autres ou une seule en particulier.

Quelle-est, à votre, avis, la meilleure implémentation/méthode pour répondre à ce cas de figure ?

Pour le moment, je m'oriente vers deux couples Client/Serveur par machine:

1 couple C/S UDP sur le port 4
1 couple C/S TCP sur le port 8

- Envoi d'un premier message broadcast indiquant la présence d'un nouveau serveur TCP (Transmision de ses IP/HOSTNAME et d'un pseudo d'identification pour la gestion de l'annuaire).

- Création, sur la ou les machines distantes, d'un client TCP qui se connecte au serveur déclaré et MAJ de son annuaire de serveur.

- Acceptation, sur la machine locale (Serveur déclaré via premier broadcast) du nouveau client et MAJ de son annuaire.

Les messages à toutes les machines se font via braoadcast UDP, et les échanges individuels par selection dans les annuaires des sokets clients ou serveurs.

Je ne crée pas d'ensemble sever/client client/serveur à chaque fois pour limiter le nombre de socket et de liaisons... méthode me paraît un peu bourrin 😕 N'y aurait-il pas une métode plus simple, plus souple et qui limiterait les connections.

je vous remercie par avance pour toutes vos remarques.

@+rémi
Pourquoi souahites-tu reprogrammer une application de A à Z plutôt que d'utiliser des outils déjà existants ? (identification par adresse MAC, gratuitous arp, etc.)
Pourquoi reprogrammer une application de A à Z ?

En fait, les machines sont des PC transformés en machines dédiées.
Un OS embarqué minimum sur lequel une seule application tourne.
Une partie de cette application, celle qui nous intéresse ici, servira à la communication entre machines.
Pour compliquer le problème, toutes les machines ont le même HostName que j'utilise dans les communications comme identification de "type" de machine.
Si les outils existants dont tu parles sont intégrables via l'API Winsock2, je suis preneur.

Edition: 16:25

Ok, suite à recherches sur ARP, je suis tombé sur iphlpapi.dll c'est nouveau pour moi.. Il va falloir bosser là dessus !
Y à t'il des exemples complets en plus du SDK ?
Houla, je ne suis pas programmeur, mais ce qui est sûr c'est que tes machines, même si elles ont le même nom devraient avoir un identifiant unique, qui devrait d'ailleurs être l'adresse mac.
A partir de là si tu as les langages de communication réseau de base, ARP devrait te permettre de repérer qui est là sur le réseau, et même que les machines se présentent directement si elles font du DHCP.
Houla pareil ! 😉 En tout cas merci, ça me donne une piste de recherche.

Donc, je reprends ce que tu me dis et je fouille... ici :

[i:def3468c75]DHCP fonctionne sur le modèle client-serveur : un serveur, qui détient la politique d'attribution des configurations IP, envoie une configuration donnée pour une durée donnée à un client donné (typiquement, une machine qui vient de démarrer). Le serveur va servir de base pour toutes les requêtes DHCP (il les reçoit et y répond), aussi doit-il avoir une configuration IP fixe. Dans un réseau, on peut donc n'avoir qu'une seule machine avec adresse IP fixe : le serveur DHCP. Le protocole DHCP s'appuie entièrement sur BOOTP : il en reprend le mécanisme de base (ordre des requêtes, mais aussi le format des messages). DHCP est une extension de BOOTP.

Si je comprends bien (ce qui n'est pas sûr) il faut un serveur... dans mon cas, pas de serveur "central", uniquement des machines pluggées "violement" en "//".

Les techniciens ne voudront pas se prendre la tête avec un protocole d'ordre de branchement et cela oblige à passer la main en cas de problème sur le serveur: Il faut donc un système où chaque machine est autonome et assure la maintenance de son annuaire. Les gars vont se brancher/débrancher à l'arrache en cas de déplacement physique sur le site d'intervention. Grosso-modo, "ils" installent un "gros" hub où tout le monde peut venir se brancher (le réseau au minimum syndical quoi...). Un fois branché, "tu" proposes d'utiliser gratuitous arp pour récupérer MAC& Co. Ok, mais qui ? La machine qui se branche pour l'envoyer à tout le monde, ou les "autres" machines pour identifié la nouvelle-venue ?
La maintenance des annuaire est faite par gratuitous arp ?
Pourrais-tu me faire une liste des étapes que tu imagines, histoire de clarifier mon approche ?

D'avance merci.

Edition: 23:00

Bon les tests avec ARP me laissent un peu sur ma fin (et ma faim d'ailleurs). Tous ces moyens ne semblent fonctionner (de manière effective) que si tu es sur un "vrai" réseau. De plus, les machines ne possèdent d'IP spécifiques puisque, en usine' rien n'est fait à ce niveau là... Difficile dans ce cas de donner une IP pour obtenir des renseignements (ça serait trop simple 😕 ) C'est pas les technos qui vont configurer les bécanes (j'imagine les conflits et le SAV pour mauvaises manips... 😥 😆 )

La question reste entière, avec toutes ces contraintes:

- Pas d'IP sur les machines (à générer donc en fonction des IP présentes)
- HostNames Identiques (configurés en usine)
- Broadcast UPD apparement incontournable pour annoncer sa présence
- Liaisons TCP pour les échanges entre deux machines et signalisation des déconections intempestives
- Liaison UDP pour les échanges collectifs

J'ai l'impression que c'est un peu incontournable... (j'espère quand-même qu'il existe une API pour gérer ça plus proprement !).
Le problème du système actuel, c'est le nombre de Sockets client/serveur générés. Je suis surpris qu'il n'existe pas un système bas niveau qui gère ça proprement... (enfin, qui intègre ce besoin particulier).

Voili voilo: Toutes idées et suggestion bienvennues

@+rémi
Si ton réseau est bel et bien en TCP/IP, tu devrais avoir tout ce qu'il te faut sous la main 🙂
[i:e098449d60]Si ton réseau est bel et bien en TCP/IP, tu devrais avoir tout ce qu'il te faut sous la main 🙂

Merci pour l'encouragement 😀 mais que veux dire tout sous la main ?

Tout sous la main pour faire se que tu me conseillais via gratuitous arp ?
Ou,
Tout sous la main pour faire se que je me propose de faire ? 😉

L'inter pas net, c'est pas toujours très simple pour partager !

@+rémi

PS: Oui, "j'utilise" TCP/UDP avec des machines reliées entre-elles via un hub. J'endends par 'vrai' réseau, un réseau avec un serveur central qui gère tout le monde. Dans mon cas, et pour de nombreuses raisons, c'est impossible.


Merci pour l'encouragement 😀 mais que veux dire tout sous la main ?

Tout sous la main pour faire se que tu me conseillais via gratuitous arp ?
Ou,
Tout sous la main pour faire se que je me propose de faire ? 😉

"Tout sous la main pour faire se que tu me conseillais via gratuitous arp"

A priori tes machines ont une pile TCP/IP complète et donc elles utilisent les mécanismes réseau de base. L'envoi de gratuitous ARP devrait donc se faire par défaut. De même tes machines peuvent être identifiées de façon unique grâce à leur adresse MAC.
Après en faisant le lien de l'un avec l'autre, tu devrais pouvoir savoir qui est présent sur le réseau.
Ok, bien compris.

L'envoi d'une requête gratuitous ARP au boot de la machine est intéressant mais quel est l'intérêt (l'apport) par rapport au "lego" TCP/UDP via les API Winsock 2 ? (la question est mal posée, certes, mais je te fais confiance pour la comprendre dans le bon sens !). Simplement de m'éviter la peine de tout ré-écrire ?

En fait, le problème central, le véritable à mon avis, c'est le nombre de CNX établies:
Si je fais un couple client/serveur TCP par machine, le nombre de liaisons connectée (sockets) devient très important (sans compter les sockets UDP):
- 2 machines, 2 liaisons 4 sockets (1 client 1 serveur par machine)
- 3 machines 6 liaisons 9 sockets (2 clients 1 serveur par machine)
- 4 machines 12 liaisons 16 sockets (3 clients 1 serveur par machine)
etc.

Je n'ai aucune expérience dans ce domaine, mais le nombre de liaisons au sein d'un "reseau" de ce type n'est-il pas prohibitif ?

@+rémi

PS: Pour ceux que ça intéresse, je pourrais fournir le code/source (ASM) à tester.

Oui, vu que le mécanisme est déjà présent.

En fait, le problème central, le véritable à mon avis, c'est le nombre de CNX établies:
Si je fais un couple client/serveur TCP par machine, le nombre de liaisons connectée (sockets) devient très important (sans compter les sockets UDP):
- 2 machines, 2 liaisons 4 sockets (1 client 1 serveur par machine)
- 3 machines 6 liaisons 9 sockets (2 clients 1 serveur par machine)
- 4 machines 12 liaisons 16 sockets (3 clients 1 serveur par machine)
etc.

Je n'ai aucune expérience dans ce domaine, mais le nombre de liaisons au sein d'un "reseau" de ce type n'est-il pas prohibitif ?
Cela dépend combien tu as de machines, mais en tout cas tu risques d'avoir pour un nombre important de machines une restriction, non pas au niveau réseau, car on est plutôt en centaines de milliers de paquets seconde, mais au niveau système pour gérer proprement toutes ces connexions en parallèle.
Aller, utilisons le matos présent et les quotes 🙂



Ok, je comprends, mais vu que je travaille déjà au niveau en dessous, c'est plus simple pour moi de re-créer le mécanisme que n'importe comment je dois gérer avec mes petites mains boudinées 😆



Ok, donc à vérifier en labo, mais l'OS semble relativement solide à ce niveau là, en tout cas d'après ce que je constate en le secouant un peu...

Pour les IP, là aucune expérience... Peut-ont les fixer via soft (API qui va bien) ou est on obligé (donc les technos) pour des raisons xxx de faire la manip "à la main" ?

@+rémi
@+rémi

Ok, je comprends 🙂


Tu dois avoir des API pour faire ça mais je ne m'y connais pas du tout !

Ok, je comprends 🙂


Tu dois avoir des API pour faire ça mais je ne m'y connais pas du tout !

Waou, ça c'est de la citation 😉

En fait la question est plutôt sur le principe que sur l'API: Rien, pour des raisons de sécurité ou autres, n'empêche de changer l'IP d'une machine dynamiquement ? Si tu confirmes, c'est cool, je n'aurai plus qu'à regarder dans le SDK.
Rien ne l'empêche, et le gratuitous ARP est là pour vérifier que tu n'es pas en train de piquer l'adresse de ton voisin 🙂
En fait je vais construire une table d'IP disponibles. Cela me permettra d'être sûr du mécanisme complet.
Quitte à ré-écrire la roue, autant se faire plaisir ! 😀

En tout cas, merci beaucoup pour tes infos et tes confirmations, ça me permet de moins hésiter dans la direction à prendre.

@+rémi
http://www.ipprimer.com/overview.cfm
Une url qui peu aider certains, enfin les anglophones... 😉