Étude de cas: ouvrir un port sur un routeur en automatique pour une expérience multijoueurs en ligne

Aujourd’hui, nous allons voir comment créer une application ou un jeu qui va automatiquement ouvrir des ports sur les routeurs des joueurs, leur permettant ainsi d’héberger des applications ou des parties multijoueurs. L’exemple est donné avec Unreal Engine, mais peut servir par ailleurs.

J’en profite d’une question que m’a posée mon ami Damien pour partager ma réponse avec vous. C’est une nouvelle catégorie d’articles (“étude de cas“) que vous allez retrouver sur ce blog, car pour moi, cela demande peu d’efforts et que mes réponses peuvent profiter à d’autres que ceux qui me l’ont posées. Je reçois une centaine de demandes comme celles-ci par semaine, donc vous pouvez toujours tenter votre chance, mais vous comprendrez que j’ai tendance à dépanner principalement mes clients et mes contacts réguliers.  Mais ça arrive, donc n’hésitez pas… si le thème me branche, il se peut même que vous deveniez prioritaire.

UPnP pour configurer un routeur

Bref, revenons en à ce sujet. Il a été traité en partie dans le tome 5 des cahiers d’Unreal Engine qui traite du multijoueurs en ligne.  Voici ce que j’en disais:

“Pour l’heure, vous avez peut-être envie de tester votre jeu avec un de vos amis à l’autre bout du pays? Le jeu que vous venez de créer peut amplement fonctionner sans aucune modification. Toutefois, il ne va pas en être ainsi de votre infrastructure réseau ! […]

Si vous êtes relié à internet par un routeur, c’est un peu plus compliqué. C’est le cas si vous avez une de ces box qui font du wifi, de la TV et un tas d’autres services. Dans ce cas, il faut «enseigner» à votre routeur que si une connexion arrive sur le port «7777», port par défaut utilisé par Unreal Engine 4, il doit tout envoyer à votre ordinateur qui jouera alors le rôle de serveur. Pour cela, on utilise le NAT (Network Address Translation). Le paramétrage de votre routeur dépasse le cadre de ce livre, mais ce que vous devez retenir, c’est qu’il faut rediriger tout ce qui arrive en UDP et TCP sur le port 7777 vers l’adresse IP LAN de la machine servant de serveur. Rien n’est à paramétrer coté client !

NAT & UPNP : Il est possible aujourd’hui de demander au routeur d’ouvrir un port à partir de votre jeu en utilisant le protocole UpnP (Universal Plug and Play). C’est une technologie réseau qui permet à un appareil ou une application de configurer automatiquement les paramètres réseau dont il a besoin sur votre modem ou votre routeur. Il faut pour cela que ce dernier ait activé la fonction, mais cela commence à être le cas dans bon nombre de routeurs.
Pour cela, vous pourriez intégrer la librairie MiniUPnP qui est disponible à cette adresse. Il en est d’ailleurs question dans le thread suivant.

Une fois cette étape passée, vous pouvez distribuer votre jeu packagé, lancer le serveur et attendre que les clients se connectent.”

Le problème rencontré

Oui, mais Damien a essayé et c’est vrai que ce n’est pas toujours simple d’implémenter des librairies externes sous UE4. Voici les difficultés qu’il a rencontrées: “pendant 1 semaine j’ai tenté d’implémenter cette lib en faisant un plugin avec le template Third Library. Le plugin en lui même, aucun soucis.

C’est dans l’implementation de la lib que ça coince. Le code source et la lib miniupnp pour windows est en x86 et faite avec une ancienne version de Visual Studio. Du coup avec un collègue, on a finalement réussi à ouvrir le projet avec VS 2015 pour faire une lib en x64.
Malheureusement UE est incapable de la reconnaitre et me renvois le message d’erreur suivant:
“”[…]miniupnpc.lib is not designed to run under Windows or it contains an error. Reinstall the program using the original installation media, or contact your software system administrator for support.”
Du coup j’ai un peu lacher l’affaire pour le moment, le temps de trouver plus d’info. Car même sur le forum de miniupnp il n’y avait pas plus d’infos que ça.”

La solution proposée

L’idée, c’est de contourner le problème – s’il est difficile d’importer une librairie externe (et encore plus que cela fonctionne sur tout type de systèmes d’exploitation ensuite), il est plus aisé de faire appel à des commandes externes. Pour cela, je vous renvoie à cette vidéo:

Ensuite, il faut trouver un script python ou tout autre “programme” qui peut réaliser l’opération voulue en ligne de commande, en passant les bons paramètres.  UPnP Portmapper me semble un bon candidat pour répondre à cette problématique. Il est en java, donc hautement portable et dispose des commandes correspondantes. A voir maintenant le retour de Damien sur la question.

PS: Je précise (suite à une question sur FB) que sous UE4, par défaut, le mode réseau est pris en charge par l’OnlineSubSystem, mais qu’il existe d’autres approches comme Steam qui jouer le rôle d’intermédiaire et qui ne nécessite pas une telle démarche.

Ces articles pourraient aussi vous intéresser …