Socket trop lents

Messages postés
4
Date d'inscription
mercredi 1 février 2006
Statut
Membre
Dernière intervention
23 août 2007
- - Dernière réponse : SnOOpss
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013
- 19 juil. 2007 à 17:35
bonjour,
jessaye de faire un jeu qui peu se jouera 2 en reseau local.
je ne connais absolument rien en reso, mais en fouillant sur le net,  jai trouver en gros comment faire et jessaye de mettre la chose sur pied en faisant des test.

le probleme c'est que la methode que jutilise ralenti grandement le jeu,  il parait quil faut que j'utilise un thread mais je ne sais pas comment faire.

pour linstant,  j'ai un programe serveur, qui envoi un caractere a chaque tour, a la fontion client de mon jeu  

comment modifier les code pour que ça ne ralentisse  plus  le  jeu??
et aussi ,  comment transmettre autre chose que des caracteres??(comme un tablo de float par exemple)

merci davance

voici mes codes:

//PROGRAMME SERVEUR
#include <winsock.h>
#include
#include <windows.h>
DWORD dwEventFlags;
DWORD dwData;


int main()
{
const SHORT Mask = 32768;
WSADATA WSAData;
WSAStartup(MAKEWORD(2,0),&WSAData);
SOCKET sock;
SOCKET csock;
SOCKADDR_IN sin;
SOCKADDR_IN csin;
sock = socket(AF_INET, SOCK_STREAM, 0);
sin.sin_addr.s_addr   = INADDR_ANY;
sin.sin_family    = AF_INET;
sin.sin_port    = htons(50);
bind(sock, (SOCKADDR *)&sin, sizeof(sin));
listen(sock, 0);
int sinsize = sizeof(csin);
              
  while(!((csock = accept(sock,(SOCKADDR *)&csin,&sinsize)) != INVALID_SOCKET))
  {}
   cout << "\nIl y a un client\n";
   while(true){  
            if (GetKeyState('K') & Mask)send(csock,"a",1,0);
            else if (GetKeyState('L') & Mask)send(csock,"b",1,0);
            else send(csock,"c",1,0);
          }
closesocket(sock);
WSACleanup();
}

// FONCTION CLIENT(utilisé par mon jeu)
#include <stdio.h>
#include
#include <winsock.h>
#include <windows.h>
SOCKET sock;
int res;
char buffer[1024];
int hh;


int con(int a){
if(!a){


WSADATA WSAData;
WSAStartup(MAKEWORD(2,0),&WSAData);


sock = socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN sin;
sin.sin_addr.s_addr = inet_addr("192.168.1.1");
sin.sin_family      = AF_INET;
sin.sin_port        = htons(50);
connect(sock,(SOCKADDR *)&sin,sizeof(sin));
}


else{
     recv(sock,buffer,sizeof(buffer),0);
     res=0;
     if (buffer[0]=='a')res=1;
     if (buffer[0]=='b')res=-1;
     }
  return res;
}
Afficher la suite 

7 réponses

Messages postés
571
Date d'inscription
vendredi 30 décembre 2005
Statut
Membre
Dernière intervention
12 juillet 2012
3
0
Merci
Salut il est fortement déconseillé d'envoyer 1 char par envoi. Si tu y tiens vraiment tu peux mais il faudrait utiliser setsockopt() pour optimiser l' algorithme de Naggle et là c'est de la programmation socket avancée que certains tutos décriront mieux que moi.

Pour le tableau de float, transformer les floats en chars et les séparer d'un caractère délimiteur.
Commenter la réponse de katsankat
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013
0
Merci
Je ne connais pas le mode de fonctionnement des socket donc je dit surement n'importe quoi mais.


Tu envoi juste un char de 1 octets si un tour dure 1/50s de seconde pour avoir un affichage de 50 images par seconde ca demande un debit de 50 o/s. Avec une connexion minimum de 12k/s en upload ca prend 0.004 s donc tu perd 0.004 s a envoyer tes données sur 1 s de jeu.
Je suis a 100/100 d'accord avec katsankat mais je trouve bizarre que ca te ralentisse.


C'est le client ou le serveur qui est ralenti ?


Le client lui par contre lit des char de 1ko/s soit 1000 fois plus.
Commenter la réponse de SnOOpss
Messages postés
4
Date d'inscription
mercredi 1 février 2006
Statut
Membre
Dernière intervention
23 août 2007
0
Merci
c'est le client qui est ralenti .  mon serveur nest qun programe qui envoi des donné en boucle,   et le client, c'est mon jeu opengl,  mais aprement, la commande recv met lontemp a sexecuter.

Je ne tien pa speialement a garder cetet methode, jessay juste de trouver une solution pr fair un jeu en reso ,  mais jy arrive pas ça menerve!  Tout les code qu je trouve ne sont pa fait pour le temps réél. A si en fait jen ai trouver un... ET bien entendu comme dabe, le code est enorme, completement incompreensible et uniformement reparti sur 500 000 fichier different!

JEN AI MAAARE!  Ya pas une methode simple???????
Commenter la réponse de cid7777777
Messages postés
4
Date d'inscription
mercredi 1 février 2006
Statut
Membre
Dernière intervention
23 août 2007
0
Merci
c'est le client qui est ralenti .  mon serveur nest qun programe qui envoi des donné en boucle,   et le client, c'est mon jeu opengl,  mais aprement, la commande recv met lontemp a sexecuter.

Je ne tien pa speialement a garder cetet methode, jessay juste de trouver une solution pr fair un jeu en reso ,  mais jy arrive pas ça menerve!  Tout les code qu je trouve ne sont pa fait pour le temps réél. A si en fait jen ai trouver un... ET bien entendu comme dabe, le code est enorme, completement incompreensible et uniformement reparti sur 500 000 fichier different!

JEN AI MAAARE!  Ya pas une methode simple???????
Commenter la réponse de cid7777777
Messages postés
571
Date d'inscription
vendredi 30 décembre 2005
Statut
Membre
Dernière intervention
12 juillet 2012
3
0
Merci
Le problème n'est pas que recv() met longtemps à s'exécuter, mais qu'il est bloquant.
Il faut que tu choisisses un modèle d'I/O adapté à tes besoins. Avec un thread par exemple. A noter aussi qu'en UDP tu y gagnerais un peu en latence. Regardes comment sont faits les codes de jeu de morpion/bataille navale etc sur ce site en général ils ne font pas 500.000 lignes de code.
Commenter la réponse de katsankat
Messages postés
492
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
12 janvier 2012
1
0
Merci
Salut,
tu peux jeter un oeil a ma source pour t'aider (peut-etre)
http://www.cppfrance.com/codes/LIBCONNECT-BIBLIOTHEQUE-CPLUSPLUS-CONNEXION_43473.aspx

<hr size="2" width="100%" />TuRn3r
Commenter la réponse de turnerom
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013
0
Merci
Il existe aussi des socket non bloquant, les socket asynchrone, va voir sur http://www.progzone.free.fr/reseau/socket/sockasync.html (c'est mon premier resultat sur google, me suis pas prit la tete)  il te deconseille meme les threads.
C'est quoi comme jeu ?

Moi je te conseille de rester avec les socket bloquant, comme ca tu n'auras pas besoin de synchroniser ton jeu.

Il n'y a pas besoin de faire passer TOUTES les information aux clients, dans la plupart des jeux par exemple pour le deplacement d'un personnage il envoi une position a t=0s et une autre a t=1s entre les deux ils utlilisent des algorithmes ou l'inverse des interpolation (j'ai pas le nom). Ce systeme passe inapercu dans des wargames mais c'est tres flagrant dans les jeux de tir (pour bf2 j'ai meme lu que le serveur "anticiperait" le deplacement de ta mire quand tu te deplace)
Commenter la réponse de SnOOpss