Hum, un nom de domaine m'épargnerai bien des complications, en effet. Après, il faut voir si c'est compatible avec ce que je veux, c'est a dire, lui fournir l'IP de n'importe quel ordinateur ayant lancé le programme serveur, et même lui fournir plusieurs IP, au cas où plusieurs programmes serveur sont lancés en même temps.
Le nom de domaine de wikipédia est caractérisé par plusieurs IP, je pense donc que ça pourrais fonctionner.
Le programme client n'aurais plus qu'a se connecter au nom de domaine, le nom de domaine lui fournirai une des adresses IP a laquelle il est lié.
Le problème qui se pose ici est donc, comment, dans un programme, ajouter une adresse IP a un nom de domaine définit depuis le programme serveur, et peut on en mettre plusieurs.
Au passage, guyver2, ton jeu a l'air bien sympatique, graphismes attrayants
Je vais me renseigner sur les émulateurs PSP.
"Le problème qui se pose ici est donc, comment, dans un programme, ajouter une adresse IP a un nom de domaine définit depuis le programme serveur, et peut on en mettre plusieurs."
Usuellement, les gens utilisent gethostbyname(3) pour faire une requete DNS et recuperer l'IP associé au noms. Cependant, quand il y a plusieurs IP associé au meme nom, je ne sais pas comment ca se passe.
la structure renvoyé par gethostbyname semble pouvoir stocké plusieurs IP, mais je n'ai jamais fait le test.
a suivre
Je me renseignerai se la fonction en question.
De toutes façons, du moment qu'elle m'indique une adresse IP, ca me convient.
Sinon, j'ai mit un téléchargement sur mon site un version améliorée du tchat du FVirtman. http://elhuron.c.la/
Inutilisable sous linux, mais j'ai un site qui montre les différences, je changerai ça plus tard.
Et il à le même effet ping-pong.
Le problème n'est pas tant que ça dans l'utilisation des threads, mais plutôt les entrées/sorties, en effet, si le client ecrit un message et en reçvoi un du serveur, il faut pas afficher sur les saisies du client.
"Le problème n'est pas tant que ça dans l'utilisation des threads, mais plutôt les entrées/sorties, en effet, si le client ecrit un message et en reçvoi un du serveur, il faut pas afficher sur les saisies du client."
Je ne sais pas quelle lib tu peux utiliser sous windows pour gerer l'affichage en console un peut mieux qu'avec des printf et des scanf. Sous linux (et d'autres Unix) tu as Ncurses qui est tres bien et assez facile.
Sinon tu peux t'orienter vers une interface graphique.
Hum, il y a conio, sinon je connais pas. Mais conio est vieux et fonctionne pas trop. ![]()
D'ailleurs, j'ai eu du mal à récupérer une ligne entiere, c'est a dire des caractères et des espaces. Avec cin.getline(cin, chaine) comme avec scanf("%156[^\n]s", chaine) ça acceptait les messages vides, du coup ça faisait un peu n'importe quoi, surtout que il y a conservation des touches appuyées, pendant que le programme associé écrit un message, si tu appuis 3 fois sur entré, les trois prochains messages que tu vas envoyer seront vides.
Du coup, je me suis fait ma propre fonction a l'aide de getchar().
Pour le mode graphique, je verrai ça, je tenterai peut être une autre lib, comme Qt, pour changer de la SDL.
si tu te lance dans Qt, cette (merveilleuse) bibliothèque a ses propres classes de gestion reseau tres simple a utiliser. Dans la doc il y a un exemple de chat a sens unique (fortune)
J'ai été sur le site https://www.dyndns.com/
Je me suis crée un nom de domaine : http://nilbuck.game-host.org
Bon, ca fonctionne pas, c'est normal, je l'ai juste crée.
Mais, je sais pas si c'est possible ,depuis un programme en C++, de modifier l'adresse IP sur laquelle il pointe.
Mon but étant d'établir la connection entre n'importe quel client, avec n'importe quel serveur. Le programme serveur va modifier l'adresse IP vers laquelle pointe le nom de domaine (plusieurs IP serais le mieux, mais si il écrase la precedante, pas trop grave), et le programme Client va utiliser l'adresse IP pointée par le nom de domaine pour se connecter avec le programme Serveur.
Je crois que je vais etre obliger de passer par un site pour gerer ça.
je ne sais pas sur quel OS tu tournes mais sur linux il existe un programme qui s'occupe de mettre a jour tout seul l'ip de ton pc.
Perso mon serveur tourne sur Ubuntu et j'utilise ceci sans avoir rencontré aucun probleme depuis plus d'un an.
http://doc.ubuntu-fr.org/ipcheck
J'imagine qu'il existe des programmes similaires pour les autres OS.
Le probleme, c'est que je suis pas la seule personne qui va devoir faire enregistrer son IP dans le nom de domaine. Je doit créer un mode multijoueur pour un de mes jeux, Nilbuck (http://elhuron.c.la).
Il faut que j'etablisse la connection entre deux personnes, donc, l'un va faire le serveur, l'autre le client, le serveur va faire signe au client qu'il ecoute en envoyant son ip au nom de domaine, il faudrais en fait que je fasse dans mon programme, comme le programme que tu utilises.
Le nom de domaine servirais uniquement a obtenir une adresse IP, mon but immédiat n'est pas d'heberger chez moi un site, ma connexion internet n'est pas asser puissante pour cela je pense, cela risquerai de ralentir l'acces pour les autres ordinateur en lien avec le routeur.
Je vais me renseigner sur le programme qui envoi une adresse IP a un nom de domaine définit. Merci de me l'avoir indiqué ![]()
la procedure de changement de l'IP pointé par le dns dépends du fournisseur du DNS. la procedure n'et pas standard. Souvent, il s'agit d'une simple requete http
Hum, en effet, ca devrais fonctionner, merci ![]()
J'ai compiler un exemple utilisant le protocole http de FVirtman, ca fonctionne bien.
Mais une requette http ne suffira pas, il faut d'abord que je me connecte au site pour acceder a mon nom de domaine, et la, une deuxieme requete pour modifier l'adresse IP.
Je vais essayer de faire un programme qui fait ca.
mais ça veut dire que si deux personnes lance ton programme en même temps, l'une des deux sera inaccessible ? ce n'est pas très pratique. Pourquoi est-ce que tu ne demande pas à l'utilisateur du client de taper lui même l'IP du serveur ?
Hum, j'y ai pensé.
Pour pallier ce probleme, toutes les x secondes par exemple, je reeffectue cette operation, ou alors, une fois l'adresse IP du nom de domaine modifiée, recuperer l'IP du domaine, et si elle change, x secondes plus tard, la retablir, comme cela, les deux serveur auraient le meme temps d'ecoute, mais bon, avec trois programme serveur, ca fonctionne plus trop...
Je veux pas laisser l'utilisateur entrer l'IP pour ne pas l'encombrer avec ca, et pour lui permettre de trouver n'importe quel serveur.
Au pire, je le laisse le client entrer manuellement l'adresse IP. Je crois que je vais opter pour cela, trop de complications sinon... ![]()
Salut. ![]()
J'ai pas mal avancé.
Premierement, je laisse le client entrer l'adresse IP du serveur.
Point de vue technique, j'ai tout ce qu'il faut pour que ca fonctionne, il me reste plus que du temps pour terminer ceci.
Mais je me pose une question concernant la methode a employer. Lors de la phase de jeu, deux solutions (a priori) s'offrent a moi :
. Des qu'il y a un changement quelconque chez un joueur, ce meme joueur envoie toutes les données a l'autre joueur le concernant.
. Je n'envoie que le stricte minimum, mais vu qu'il y a des variables qui s'incrementent tous les x tours, il faut egaliser la vitesse des deux joueurs, soit, a chaque fin d'un tour de boucle, attendre l'autre joueur.
La deuxieme methode est plus egalitaire (vitesse de jeu similaire).
Prenons un exemple, pour une phase de combats RPG, deux joueurs ont un certain nombre de points de vie, qui montent tous les 10 tours de boucle, et chacun d'entre eux peut attaquer l'autre.
1. Des que la vie d'un joueur augmente, ou qu'il attaque, ce meme joueur envoie toutes les infos necessaires a l'autre joueur
2. Des qu'un joueur atatque, on envoie les degats, mais l'augmentation de la vie de chacun des joueurs est gérée sans connexion, car il y a attente en fin de boucle.
Merci de me conseiller sur la methode a suivre, les deux ont leurs avantages.
Je me suis renseigner un peu, la premiere methode est beaucoup plus interressante. Une fonction lancée en thread pour ecouter l'autre joueur, pour l'envoi, je sais pas si je crée un thread, je commencerai tout d'abord sans, a voir si ca ralentie trop le programme principal.
la synchronisation est l'un des plus gros problème de ce genre de logiciel. Je ne connais pas grand chose là dessus, mais je sais ce qu'il ne faut pas faire : l'un de tes clients ne doit surtout pas attendre à chaque fin de tour que l'autre lui dise qu'il a terminé aussi. Sinon tu vas perdre énormément de temps à cause des latence du réseau et c'est très dommage. Mais bien sûr, tu ne peut pas te reposer uniquement sur la mesure de l'heure par chacun des clients (surtout que c'est une source de triche facile).
Alors, une des bonnes méthodes peut être par exemple que tout les dix tours (nombre pris au hasard) les deux clients s'envoie le nombre de tour où ils en sont (mesuré dans l'unité la plus précise que tu peut, mais pas en fonction de l'heure de l'ordinateur). Et ensuite ils continuent d'avancer sans attendre la réponse. Par contre, lorsqu'ils recoient cette information, celui des deux qui est le plus en avance ralenti (si c'est possible, ou s'arrète un instant) pour se resynchroniser. Donc tu ne perd que le temps que tu es obligé de perdre.
Hum, en effet c'est une bonne idée.
Merci de me l'avoir fait parvenir.
Je vais essayer d'etablir un systeme qui synchronise bien le client et le serveur, ca va pas etre facile.
ce qui est fait dans les mmorpg, c'est que les clients calculent la suite de la scène en fonction de ce qu'ils savent deja, (position, vitesse, action en cours). Ces informations sont actualisées régulièrement pour laisse peu de marge entre la prévision du client et la version du serveur.
Merci pour ces infos supplementaires.
Heuresement, dans mon projets, je n'ai pas de vitesse, ni de positions a gerer, et l'action est commandé brievement (bien qu'elle dure un certain temps apres), donc c'est pas trop dur a gérer. J'y ai pas fait attention, mais j'ai choisit un projet facile concernant le reseau pour y debuter, parce que, meme un pong basique qui est simple a faire demanderais plus de travail dans la partie reseau, avec la vitesse de la barre par exemple.
Salut. Je suis confronté a un nouveau probleme.
Le serveur et le client on chacun un thread en fonctionnement qui ecoute les envois de l'autre.
Pour un bon fonctionnement du tout, il me fallait un programme qui domione l'autre, c'est a dire que le client, pour attaquer le serveur, doit demander confirmation. Mais il doit ecouter la reponse, Or il ecoute deja dans le thread...
Le serveur, lui, envoi directement l'attaque au client, donc pas de problemes ici.
La solution est a priori de tuer le thread pour le recreer juste apres, mais bon, c'est pas super... Ou alors, il va falloir que dans mes envois, je distingue deux choses, ce qui me fait qu'une ecoute, mais bon galere de reformer mes structures d'envoi...