j'ai rien compris, tu nous la refait ? ![]()
Le client doit demander confirmation de quoi?
Uhuh, moui en effet pas tres comprehensible.
Je vais plutot poser un probleme general.
Prenons un jeu de course a deux joueurs, l'un est le client, l'autre le serveur.
Admettons que chacun des deux joueurs peut tirer des missiles a n'importe quel moment. Donc, la fonction d'ecoute de chacun est monopolisée (avec winsock2.h : la fonction recv).
Admettons que Tous les 10 tours, la position, la direction, de chacun est envoyée a l'autre. On ne peut ajouter une autre fonction recv qui entrerait en collision avec l'autre precedemmant employée.
La solution est donc d'envoyer pour signaler un missile ou les variables de positions(,...) une structure contenant tout, et, apres une etude des infos recus, en deduire qu'il s'agit soit d'un tir, soit juste d'une mise a jours.
Mais bon, c'est pas super efficace, car il faut envoyer toute la structure, meme si on ne veut que signaler que l'on tire un missile. Mais en meme temps, il y a pas d'autre solution.
J'aurais aimé savoir comment vous proceder lorsque vous gerer le reseau et qu'il y a des infos differentes a envoyer, il y a peut etre des astuces que je ne connais pas.
Ne maitrisant pas encore du tout le reseau, j'ai fait pas mal d'erreurs a cause de deux fonctions d'ecoutes mises en place ensembles.
pas besoin d'envoyer à chaque fois une grosse structure qui contient tout. Tu as une petite structure pour tes missile (ce que tu utilise déjà) et une autre petite pour tes informations de positions etc. Puis quand l'un envoie la première structure, il envoie d'abord un octet égale à 1 et d'abord un octet égale à 2 s'il envoie l'autre structure par exemple. Comme ça, celui qui recoit sait ce qu'il va recevoir et utilise la bonne structure.
Hum, pas bete, en effet. Merci ![]()
Au passage, avec la fonction recv et send, je n'arrive pas a envoyer autre chose que l'adresse d'un char en deuxieme argument.
Quoique je pourrais peut etre essayer ceci :
int nombre=5; SOCKET sock;
send(sock, &( (static_cast<char>)(nombre) ), sizeof(nombre), 0);
un static cast ici serait catastrophique (car tu enverrais vraiment un char et plus un int), ce que tu veut vraiment faire, c'est un reinterpret cast (les données ne sont pas modifier, seulement la manière dont on veut les traiter).
Mais tu n'en as pas besoin, car ce n'est pas le int qu'il faut convertir en char. Mais le int* qu'il faut convertir en char* et là, un reinterpret cast est sans danger (mais vu que ces fonctions sont du C, tu devrais faire un cast "à la C" plutôt).
j'aurais donc tendance à utiliser :
send(sock, (char*)&nombre), sizeof(nombre), 0);
mais tu peut mettre un reinterpret_cast à la place du (char*) - ou un static_cast si tu préfère.
Merci pour l'info dnob700 ![]()
Cependant, je trouve cela semi-louche qu'il faille préciser le type pour une adresse. Une adresse reste une adresse, qu'elle represente un entier ou un char, mais bon, c'est la fonction qui est presenté comme ca, donc bon... ![]()
Bonsoir.
J'ai testé le protocole HTTP, dans le but d'envoyer une requete POST. Je recupere ceci dans une page sur mon site et j'entre dans une base de donné si nécessaire.
Le programme ne fait aucun signe d'erreur, la requete est apparemment transmise. Mais vu que rien n'est afficher dans la BDD, la requete doit etre fausse.
Voici un exemple de requete :
POST page.php HTTP/1.0
Host: elhuron.ifrance.com
&pseudo=ElHuron
sprintf(commande, "POST page.php HTTP/1.0\r\nHost: elhuron.ifrance.com\r\n\r\n&pseudo=%s", pseudo);
Avec la version 1.1 HTTP, j'indique la taille, mais le resultat est exactement le meme.
Je me suis renseigné sur la methode POST, je vois pas comment faire autrement, le probleme vient de ma requete ?
Voici le code source du programme :
http://rafb.net/p/NLsdrj26.html
N'hesitez pas a compiler et modifier la requete.
Pour voir si le pseudo s'est affiché : http://elhuron.ifrance.com/page.php
J'arrive a envoyé un pseudo via un formulaire sur un autre page de mon site, donc page.php fonctionne sans probleme, l'erreur vient de la requete.
J'ai corriger mon code :
http://rafb.net/p/DeeAud81.html
A present, la reponse est 200, donc la requete est OK, et j'enregistre la reponse du serveur dans une page html.
Mais il n'y a toujours aucun resultat.
Et sinon, pour recuperer ceci sur mon site, c'est $_POST['pseudo'] ou $_GET['pseudo'] ?
J'ai l'impression que c'est le get...
J'ai mit les deux dans ma page.php
Héhé
J'ai trouvé, voici la requete :
POST /page.php HTTP/1.1
Host: elhuron.ifrance.com
Connection: Close
Content-type: application/x-www-form-urlencoded
Content-Length: 15
pseudo=Bertrand
J'avait pas preciser certaines choses, comme Content-type et Connection. ![]()
Bonsoir.
J'ai a priori reussit a gérer la synchronisation.
En fait, je gère cela en deux parties :
1. Si le nombre total de tours d'un joueur est superieur au nombre de tour de l'autre joueur et que le tour precedent, le nombre de tours de l'adversaire etait inferieur a celui du joueur, alors, on modifie la vitesse du joueur pour qu'il aille a la meme vitesse que l'adversaire.
2. Ensuite, logiquement, les deux programmes tournent a la meme vitesse. Il faut donc reequilibrer les tours perdus le tour precedent, du coup, le plus rapide au total va ralentir chaque tour un cetain nombre de temps pendant 15 tours il me semble.
Pour etablir la connection entre les deux joueurs, je laisse le programme client entrer l'adresse IP de l'ordinateur du programme serveur.
Je compte ajouter un autre systeme qui se sert de mon site pour etablir la connection entre les deux joueurs, vu que j'arrive a utiliser le protocole HTTP.
Le programme serveur va envoyer son adresse IP par POST sur une page, le serveur sur mon site va recuperer ceci et le stocker dans une base de donnée.
Le client, lui, va demander une page a mon site qui contient les adresses IP, et en extraire une adresse IP.
On aura donc besoin ici de l'adresse IP de l'ordinateur qui joue le role de serveur. Il peut la noter, mais je prefere l'obtenir autrement si possible. Je pourrait utiliser le protocole HTTP pour obtenir l'adresse IP sur un site web, mais si la page web change, cela devient impossible d'obtenir l'adresse IP.
Je me suis renseigner ici :
http://www.cppfrance.com/codes/TROUVER-PROPRE-ADRESSE-IP_20009.aspx
Il renvoi l'adresse IP locale je crois si il y a routeur ou autre. Au pire, j'utilise ceci, et j'indique qu'en cas de routeur, ca ne fonctionnera pas.
Je voudrais donc savoir si c'est possible d'obtenir l'adresse IP public d'un ordinateur dans un programme sans passer par un site web.
Merci ![]()
non, ce n'est pas possible d'obtenir l'IP.
il faut demander l'information a une source externe.
Merci pour la reponse. ![]()
Je vais donc laisser l'utilisateur qui joue le role de serveur enterr lui-même son adresse IP.
Salut.
Je me demandais si certains utilisent le serveur de leur site web pour gerer le multijoueur dans leur jeu ?
Ca permet de n'avoir rien a payer pour le serveur (site web non payant), mais l'hebergeur reagit je pense si il y a trop de traffic ?
A moins de faire un jeu vraiment énorme (beaucoup de joueurs, beaucoup d'infos), je pense que le trafic généré par le jeu est inférieur a celui généré par un site assez visité.
De toute facon, les hebergements sont payés pour une bande passante et un quotas de trafic (généralement) donc quand tu dépasses, ça coupe.
Si tu ne peux pas ecrire une page qui ne se termine pas et streamé les donnée en gardant des canaux actifs vers tous les clients, passer par un serveur web risque d'avoir un cout important en latence.
Si ton jeux est peu consommateur en temps de calcul, je veux bien l'heberger.
Merci pour vos reponses.
Merci pour la proposition godrik, mais c'etait juste a titre d'information, le jeu sur lequel je bosse ne demande qu'une relation client/serveur.
Et je suis pas pret à me lancer dans le develeppement d'un jeu avec plusieurs clients et un serveur qui gèere le tout.
Sinon, concernant l'IP, je laissais le programme serveur entrer son IP pour ensuite l'envoyer par POST sur le serveur de mon site. Mais il y a plus simple, dans la page qui traite les informations sur mon site, j'assigne a l'adresse IP cette valeur : $_SERVER["REMOTE_ADDR"], l'adresse IP du systeme qui a envoyé la requete POST.
Héhé, ca fonctionne bien, deux utilisateurs peuvent etablir une connexion sans se connaitre l'un l'autre.
Pour le client, il faut un legere attente pour telecharger le fichier contenant les adresses IP des serveurs.
En fait, le client ne prends que l'adresse IP la plus recente. En effet, Admettons que le programme serveur plante, il ne supprime pas son IP du fichier contenant les adresses IP, prendre l'adresse IP la plus ancienne donnerait l'adresse IP du programme serveur qui a planté, donc plus possible d'etablir une quelconque connexion client/serveur.
En effet, des que le programme serveur est activé, il envoie par POST une requete, son adresse IP est stockée au debut du fichier, et si il recoit un client, ou encore si il quitte, il envoi une autre requette POST pour supprimer son adresse IP.
Si l'adresse IP du programme serveur change, il ne pourra la supprimer, mais au vu de la gestion des adresses IP lues par les programmes clients, ca ne pose pas trop de problemes.
Maintenant, il va rester quelques bugs, mais c'est pas facile de créer un systeme multijoueur qui fonctionne presque parfaitement. Mais mon systeme doit déjà plutot bien fonctionner.
Il restait un leger bug dans la synchronisation, une ligne de code mettant a zero le nombre de tours du joueur mal placée...
Voici comment je gere la synchronisation, comme dit précédemment :
1. Si le nombre total de tours d'un joueur est superieur au nombre de tour de l'autre joueur et que le tour precedent, le nombre de tours de l'adversaire etait inferieur a celui du joueur, alors, on modifie la vitesse du joueur pour qu'il aille a la meme vitesse que l'adversaire.
2. Ensuite, logiquement, les deux programmes tournent a la meme vitesse. Il faut donc reequilibrer les tours perdus le tour precedent, du coup, le plus rapide au total va ralentir chaque tour un cetain nombre de temps pendant 15 tours il me semble.
J'ai complété le premier point en décrémentantant le ralentissement s'il est positif tous les 5 tours, ce qui permet de rétablir progressivement la vitesse initiale en cas de ralentissement passager.
J'ai pas trouvé de meilleure facon pour gérer la synchronisation. Si vous connaissez des choses dans ce domaine auxquelles je n'ai pas pensé, n'hésitez pas a m'en faire part. Je pense pas que je toucherai a mon système, qui est relativement fonctionnel, mais on sait jamais, pour une prochaine fois.
Salut, j'ai enfin terminé le jeu en question, j'en ai mit du temps...
Lien : https://www.jeuxvideo.com/forums/1-31-8566853-1-0-1-0-nilbuck-v2-1-combats-rpg-c-multi.htm
Je vais faire une pause réseau. ![]()