J'ai construit une bibliothèque pour une programmation purement multiplateforme. Mes jeux créés avec lui fonctionnent bien sous Android, Pc, Linux, Mac, etc.
Les capacités de mise en réseau sont fournies par la bibliothèque ENET, donc toutes les communications entre mes applications ne sont pas compatibles TCP ou UDP, mais uniquement dans le protocole personnalisé, même difficile, basé sur l'UDP en fin de compte.
Je ne pense pas qu'il soit possible de faire ce que je veux avec ENET, c'est pourquoi je demande ici de l'aide!
Disons que j'ai le même jeu en cours d'exécution sur mon téléphone Android, mon ordinateur portable et mon PC. Ils sont tous dans le même réseau wifi, et donc dans un LAN, que ce soit son hotspot Wifi (?) Ou le routeur domestique.
J'ai besoin que chacun de ces 3 pairs découvre les deux autres du réseau. Ceci est uniquement destiné à trouver l'IP des applications actives dans le réseau LAN, pour pouvoir héberger des jeux multijoueurs entre elles.
Je ne peux penser qu'à un moyen efficace de le faire, la diffusion UDP, attendre les réponses, mais si c'est la solution, j'ai besoin de quelque chose de petit, car c'est le seul but de la mise en œuvre.
Une autre façon pourrait être d'essayer de se connecter à toutes les adresses IP dans la sous-plage d'adresses LAN, mais je ne pense pas que le système d'exploitation serait avec moi sur celui-ci: p
la source
Réponses:
Comme beaucoup de gens l'ont dit, la solution serait d'utiliser la diffusion UDP , mais il y a beaucoup de détails de mise en œuvre impliqués. J'ai récemment rencontré le même problème et après avoir élaboré une solution, j'ai créé un blog et un exemple de projet sous la forme d'un serveur / client de chat LAN. Je vais les résumer ici, mais vous devriez les vérifier pour plus de détails et du vrai code.
Voici comment cela fonctionne, basé sur une description de Lee Salzman, créateur d'ENet:
La bonne nouvelle est que ENet fournit des fonctions d'encapsulation pour l'utilisation des sockets , vous pouvez donc tout faire dans ENet. La mauvaise nouvelle est que l'emballage est extrêmement mince; vous aurez besoin de connaître la programmation des sockets , comme quoi
select()
faire. C'est pourquoi je vous encourage à jeter un œil à l' article de blog et à l' exemple de projet afin de pouvoir copier / coller le code et vous faire gagner beaucoup de temps.Voici quelques notes et pièges si vous choisissez de faire votre propre implémentation:
enet_socket_create(ENET_SOCKET_TYPE_DATAGRAM)
(ouSOCK_DGRAM
pour une programmation de socket ancienne)enet_socket_set_option(socket, ENET_SOCKOPT_REUSEADDR, 1)
(ouSO_REUSEADDR
) afin que plusieurs serveurs puissent s'exécuter sur la même IP.enet_socket_set_option(scanner, ENET_SOCKOPT_BROADCAST, 1)
(ouSO_BROADCAST
), sinon vous ne pourrez pas envoyer à l'adresse de diffusion. Il s'agit uniquement d' une fonction de sécurité qui rend plus difficile l'inondation accidentelle du réseau.Malheureusement, ce n'est pas exactement une solution "légère"; l'exemple de projet se situe à quelques centaines de LOC au total. Ce serait bien si cela était empaqueté dans une bibliothèque d'utilitaires pour ENet, mais j'ai trouvé que pour les serveurs de jeux, vous souhaitiez souvent envoyer des informations plus spécifiques au jeu avec la réponse du serveur pour rendre cela utile, comme:
la source
Lorsque vous ne voulez pas quitter votre bibliothèque, vous pouvez simplement utiliser la force brute et tenter de vous connecter à chacune des adresses possibles. La plupart des réseaux locaux résidentiels sont des réseaux de classe C (/ 24) où les 24 premiers bits de l'adresse IP sont identiques et les 8 derniers bits diffèrent. Vous n'avez donc que 255 adresses IP possibles.
Mais quand même, faire une diffusion UDP serait l'alternative la plus propre. Envoyez simplement un paquet UDP au 255.255.255.255 et tous les clients derrière le même routeur le recevront. Ils peuvent ensuite envoyer une réponse à l'adresse IP source et au port source du paquet pour informer l'expéditeur de leur présence.
la source
Vous pouvez jeter un œil à DNS-SD / ZeroConf / Avahi / Bonjour / mDNS . C'est ce que Apple utilise pour partager des imprimantes, des dossiers iTunes, etc., mais il a été adopté ailleurs. Avahi est la version open source que Linux utilise (je ne sais pas si c'est uniquement Linux), je ne sais pas à quel point tout est portable (bien qu'il existe des implémentations pour la plupart des plates-formes).
Cela dit, il est probablement plus facile de simplement faire la diffusion UDP.
la source