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

Aujourd’hui, nous allons voir com­ment créer une appli­ca­tion ou un jeu qui va automa­tique­ment ouvrir des ports sur les rou­teurs des joueurs, leur per­me­t­tant ain­si d’héberger des appli­ca­tions ou des par­ties mul­ti­joueurs. L’exemple est don­né avec Unre­al Engine, mais peut servir par ailleurs.

J’en prof­ite d’une ques­tion que m’a posée mon ami Damien pour partager ma réponse avec vous. C’est une nou­velle caté­gorie d’articles (“étude de cas”) que vous allez retrou­ver sur ce blog, car pour moi, cela demande peu d’efforts et que mes répons­es peu­vent prof­iter à d’autres que ceux qui me l’ont posées. Je reçois une cen­taine de deman­des comme celles-ci par semaine, donc vous pou­vez tou­jours ten­ter votre chance, mais vous com­pren­drez que j’ai ten­dance à dépan­ner prin­ci­pale­ment mes clients et mes con­tacts réguliers.  Mais ça arrive, donc n’hésitez pas… si le thème me branche, il se peut même que vous deve­niez pri­or­i­taire.

UPnP pour configurer un routeur

Bref, revenons en à ce sujet. Il a été traité en par­tie dans le tome 5 des cahiers d’Unreal Engine qui traite du mul­ti­joueurs en ligne.  Voici ce que j’en dis­ais:

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 ample­ment fonc­tion­ner sans aucune mod­i­fi­ca­tion. Toute­fois, il ne va pas en être ain­si de votre infra­struc­ture réseau ! […]

Si vous êtes relié à inter­net par un rou­teur, c’est un peu plus com­pliqué. C’est le cas si vous avez une de ces box qui font du wifi, de la TV et un tas d’autres ser­vices. Dans ce cas, il faut «enseign­er» à votre rou­teur que si une con­nex­ion arrive sur le port «7777», port par défaut util­isé par Unre­al Engine 4, il doit tout envoy­er à votre ordi­na­teur qui jouera alors le rôle de serveur. Pour cela, on utilise le NAT (Net­work Address Trans­la­tion). Le paramé­trage de votre rou­teur 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 ser­vant de serveur. Rien n’est à paramétr­er coté client !

NAT & UPNP : Il est pos­si­ble aujourd’hui de deman­der au rou­teur d’ouvrir un port à par­tir de votre jeu en util­isant le pro­to­cole UpnP (Uni­ver­sal Plug and Play). C’est une tech­nolo­gie réseau qui per­met à un appareil ou une appli­ca­tion de con­fig­ur­er automa­tique­ment les paramètres réseau dont il a besoin sur votre modem ou votre rou­teur. Il faut pour cela que ce dernier ait activé la fonc­tion, mais cela com­mence à être le cas dans bon nom­bre de rou­teurs.
Pour cela, vous pour­riez inté­gr­er la librairie Mini­UP­nP qui est disponible à cette adresse. Il en est d’ailleurs ques­tion dans le thread suiv­ant.

Une fois cette étape passée, vous pou­vez dis­tribuer votre jeu pack­agé, lancer le serveur et atten­dre que les clients se con­nectent.”

Le problème rencontré

Oui, mais Damien a essayé et c’est vrai que ce n’est pas tou­jours sim­ple d’implémenter des librairies externes sous UE4. Voici les dif­fi­cultés qu’il a ren­con­trées: “pen­dant 1 semaine j’ai ten­té d’implémenter cette lib en faisant un plu­g­in avec le tem­plate Third Library. Le plu­g­in en lui même, aucun soucis.

C’est dans l’implementation de la lib que ça coince. Le code source et la lib mini­up­np pour win­dows est en x86 et faite avec une anci­enne ver­sion de Visu­al Stu­dio. Du coup avec un col­lègue, on a finale­ment réus­si à ouvrir le pro­jet avec VS 2015 pour faire une lib en x64.

Mal­heureuse­ment UE est inca­pable de la recon­naitre et me ren­vois le mes­sage d’erreur suiv­ant:
“”[…]miniupnpc.lib is not designed to run under Win­dows or it con­tains an error. Rein­stall the pro­gram using the orig­i­nal instal­la­tion media, or con­tact your soft­ware sys­tem admin­is­tra­tor for sup­port.”

Du coup j’ai un peu lach­er l’affaire pour le moment, le temps de trou­ver plus d’info. Car même sur le forum de mini­up­np il n’y avait pas plus d’infos que ça.”

La solution proposée

L’idée, c’est de con­tourn­er le prob­lème — s’il est dif­fi­cile d’importer une librairie externe (et encore plus que cela fonc­tionne sur tout type de sys­tèmes d’exploitation ensuite), il est plus aisé de faire appel à des com­man­des externes. Pour cela, je vous ren­voie à cette vidéo:

Ensuite, il faut trou­ver un script python ou tout autre “pro­gramme” qui peut réalis­er l’opération voulue en ligne de com­mande, en pas­sant les bons paramètres.  UPnP Portmap­per me sem­ble un bon can­di­dat pour répon­dre à cette prob­lé­ma­tique. Il est en java, donc haute­ment portable et dis­pose des com­man­des cor­re­spon­dantes. A voir main­tenant le retour de Damien sur la ques­tion.

PS: Je pré­cise (suite à une ques­tion 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éces­site pas une telle démarche.

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.