IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

[Réseau] socket trop lent


Sujet :

C++

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4
    Par défaut [Réseau] socket trop lent
    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:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
     
    //PROGRAMME SERVEUR
    #include <winsock.h>
    #include <iostream.h>
    #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 <iostream.h>
    #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;
    }

  2. #2
    Membre éclairé Avatar de ZaaN
    Inscrit en
    Novembre 2005
    Messages
    819
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 819
    Par défaut
    Tu as juste un code d'exemple de communication entre deux sockets...

    Mais tu peux serialiser des élements (du moment qu ils sont serialisable) et les balancer sur la ligne.

    Cela dit il existe plusieurs moyens de communiquer entre deux PC et les sockets ne sont peut etre pas le plus adapté à ton cas... quoique...

    Cependant il est vrai que mettre un ecouteur (code à l'ecoute de donnée arrivantes) dans un thread augmenterais les performance de ton programme, car tu délègue a un thread la communication et pendant ce temps les autre thread peuvent s'occuper du jeu.

  3. #3
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    C'est quoi qui est ralenti, le client ou le serveur ?

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4
    Par défaut
    en fait, la fonction client est apelée a chaque boucle de mon jeu (avec a=1). jimagine que c'est le recv qui atend de recevoir qqchose a chque tour, et donc ça ralenti le jeu.

    lidée du thread me parait aproprié Zaan, mais tu me dit ça avecc des mots ça maide que tres peu, je suis nul quest ce que je dois ajouter au code pr faire ce que tu dit(avec les thread)??

  5. #5
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Ben normal, si tu veux attendre de recevoir des données, il faut attendre pour les avoir. Si tu n'as pas besoin des données tout de suite, autant ne pas les attendre.
    Ce qu'il faudrait faire, c'est revoir ta conception.

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4
    Par défaut
    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 SVP???????

Discussions similaires

  1. Réponses: 0
    Dernier message: 13/01/2015, 15h04
  2. Convolution trop lente...
    Par progfou dans le forum Traitement d'images
    Réponses: 6
    Dernier message: 05/08/2006, 11h44
  3. boucle while trop lente
    Par atouze dans le forum Access
    Réponses: 17
    Dernier message: 15/06/2005, 16h35
  4. [SAGE] ODBC trop lent
    Par tileffeleauzed dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 14/11/2004, 09h56
  5. Envoi de mail trop lent
    Par MASSAKA dans le forum ASP
    Réponses: 3
    Dernier message: 15/10/2004, 10h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo