Partage
  • Partager sur Facebook
  • Partager sur Twitter

[C++] Deux boucles en même temps...?

Socket...

    2 décembre 2005 à 14:38:39

    Bonjour,
    Après avoir longtemps cherché sur Google et cherché moi-même une solution j'en trouve aucune, alors voici mon problème : j'ai fait un chat en C++ (mode console) en utilisant WinSock et tout marche parfaitement, seulement ça marche avec deux éxecutables, le serveur qui ne fait que afficher les messages et le client qui sert à envoyer les messages. ^^

    Maintenant, ce que je voudrais, c'est mettre le serveur et le client sur une seule fenêtre, un seul fichier. :)

    Et là je n'y arrive pas du tout, parce que pour recevoir et afficher les messages il faut faire une boucle qui tourne sans arrêt, mais comment faire pour pouvoir envoyer des messages en même temps que la boucle serveur tourne toujours ? o_O


    Voici ce que j'ai essayé :


    #include <cstdlib>
    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <conio.h>
    #include <winsock2.h>
    #pragma comment(lib, "ws2_32.lib&quot;)

    using namespace std;

    int envoi(void) {

    // Code pour envoyer...

    }


    int serveur(void) {

    while (1) {

    if (kbhit()) { //Si une touche a été appuié
    envoi();
    }

    // Code du serveur...
    }

    }

    int main(void) {

    serveur();

    }


    J'ai mis ici le fonctionnement du code, je mettrais le vrai code si vous me le demandez ^^
    Le problème c'est que pendant qu'on est entrain d'envoyer un message le serveur ne tourne plus du coup si l'autre essaye de nous envoyer un message ça va pas marcher et avec WinSock si ça marche pas une fois ça bloque le programme :-°

    Voilà, merci d'avance ;)
    • Partager sur Facebook
    • Partager sur Twitter
      2 décembre 2005 à 15:50:27

      Si j'ai compris quelque chose, essaye de regarder du coté des threads.
      • Partager sur Facebook
      • Partager sur Twitter
        2 décembre 2005 à 17:18:45

        Citation

        Si j'ai compris quelque chose, essaye de regarder du coté des threads.



        Je suis tombé sur ce mot plusieurs fois pendant mes recherches, peux-tu me dire c'est quoi exactement ? :)
        • Partager sur Facebook
        • Partager sur Twitter
          2 décembre 2005 à 18:33:46

          Thread ou socket non bloquante.
          • Partager sur Facebook
          • Partager sur Twitter
            2 décembre 2005 à 19:02:23

            Les threads, c'est géré par l'OS, et ça permet l'exécution de plusieurs fonctions quasi simultanément (avec un très légé décalage imperceptible qui dépend de la priorité et de la puissande du pc).

            Le pc exécute un bout de programme pendant quelques milisecondes, le met en pause, passe à un autre processus et ainsi de suite.


            http://perso.numericable.fr/~fvirtman/info/tuto/index.html

            tout en bas de la page ;)
            • Partager sur Facebook
            • Partager sur Twitter
              2 décembre 2005 à 19:08:02

              Oki merci mais vous n'auriez pas des liens pour apprendre à utiliser les multithreads ? Parce que ça à l'air bien compliqué quand-même ;)
              • Partager sur Facebook
              • Partager sur Twitter
                2 décembre 2005 à 19:09:04

                Tu as lu mon message? T'as visité le lien? T'as lu l'exemple en bas de la page sur les threads??

                PS: Treads != Multithreading....
                • Partager sur Facebook
                • Partager sur Twitter
                  2 décembre 2005 à 19:39:33

                  Citation : Seeme

                  Tu as lu mon message? T'as visité le lien? T'as lu l'exemple en bas de la page sur les threads??

                  PS: Treads != Multithreading....



                  Dsl j'avais pas rafraichi la page ^^ Merci :p
                  • Partager sur Facebook
                  • Partager sur Twitter
                    2 décembre 2005 à 19:44:13

                    Citation : Seeme

                    Tu as lu mon message? T'as visité le lien? T'as lu l'exemple en bas de la page sur les threads??

                    PS: Treads != Multithreading....



                    Non ? Et ca sert à quoi alors ?
                    • Partager sur Facebook
                    • Partager sur Twitter
                      2 décembre 2005 à 20:20:48

                      Mackila, un lien pour les sockets non bloquants ? Ca m'intéresse aussi :D
                      • Partager sur Facebook
                      • Partager sur Twitter
                        3 décembre 2005 à 16:19:17

                        Citation : ddx39


                        J'ai mis ici le fonctionnement du code, je mettrais le vrai code si vous me le demandez ^^



                        Je peux avoir le code svp.

                        Merci. :D
                        • Partager sur Facebook
                        • Partager sur Twitter
                          4 décembre 2005 à 0:57:45

                          Citation : fgh

                          Citation : ddx39


                          J'ai mis ici le fonctionnement du code, je mettrais le vrai code si vous me le demandez ^^



                          Je peux avoir le code svp.

                          Merci. :D



                          J'en profite pour dire que le multithreading a marché et que appart quelques petits bugs d'affichage mon prog marche parfaitement :p

                          Voilà la source :

                          #include <windows.h>
                          #include <iostream>
                          #include <stdlib.h>
                          #include <string.h>
                          #include <stdio.h>
                          #include <conio.h>
                          #include <winsock2.h>
                          #pragma comment(lib, "ws2_32.lib";)

                          using namespace std;

                          int abc=0, ab=0;

                          unsigned long WINAPI serveur(void* params)
                          {




                          char *pseudo=NULL;
                          pseudo=new char[70];
                          WSADATA WSAData;
                          WSAStartup(MAKEWORD(2,0), &WSAData);
                          SOCKET sock;
                          SOCKET csock = INVALID_SOCKET;
                          SOCKADDR_IN sin;
                          sock = socket(AF_INET,SOCK_STREAM,0);
                          sin.sin_addr.s_addr = INADDR_ANY;
                          sin.sin_family    = AF_INET;
                          sin.sin_port        = htons(1339);

                          bind(sock, (SOCKADDR *)&sin, sizeof(sin));
                          listen(sock, 1);
                          int a=sizeof(sin);

                          while(1) {
                                   while(csock == INVALID_SOCKET) {
                                               csock = accept(sock,(SOCKADDR*)&sin,&a) ;
                                               }
                          char *mots=NULL;
                          mots=new char[1024];
                          recv(csock, mots, 1024, 0);

                          if (mots[0]=='/' && mots[1]=='N' && mots[2]=='I' && mots[3]=='C' && mots[4]=='K' && mots[5]==32) {
                                           int ls=strlen(mots), is=6, ns=0;
                                           while (ls>=is) {
                                                 pseudo[ns]=mots[is];
                                                 is++;
                                                 ns++;
                                                 }
                                                 }
                                                 
                                                           else if (mots[0]=='/' && mots[1]=='W' && mots[2]=='I' && mots[3]=='Z' && mots[4]=='Z') {
                                                 cout<<"\a\a\a                 "<<pseudo<<" vous a envoye un Wizzz \n\n\a\a\a";
                                                 }
                                                 
                                                 else {
                              if (abc!=0) {
                                          cout<<"\n\n";
                                          abc=0;
                                          }             
                          cout<<pseudo<<" : "<<mots<<"\n\n";
                          }
                          delete[] mots, pseudo;
                          csock = INVALID_SOCKET;
                          }




                          return 0;
                          }




                          int sendnick(char *psd=new char[70], char *ip=new char[32]) {
                             
                          char nick[1024]="/NICK ";
                          strcpy(nick, psd);
                          WSADATA WSAData;
                          WSAStartup(MAKEWORD(2,0), &WSAData);
                          SOCKET sock;       
                          sock = socket(AF_INET,SOCK_STREAM,0);
                          SOCKADDR_IN sin;   
                          sin.sin_addr.s_addr     = inet_addr(ip)
                          sin.sin_family    = AF_INET; 
                          sin.sin_port        = htons(1339);   

                          bind(sock, (SOCKADDR *)&sin, sizeof(sin));
                          connect(sock, (SOCKADDR *)&sin, sizeof(sin));
                          send(sock, nick, 1024, 0);
                          closesocket(sock);
                          WSACleanup();

                          delete[] ip, psd;

                          return 0;
                          }





                          int debut(void) {
                              system("cls");
                              char *ip=NULL, *log=NULL;
                          log=new char[70];
                          ip=new char[32];
                          cout<<"Entrez l'adresse IP avec laquelle vous souhaitez communiquer : ";
                          gets(ip);
                          cout<<"\nEntrez votre pseudo : ";
                          gets(log);
                          while (1) {
                                char *mot=NULL;
                                mot=new char[1024];
                                while (1) {
                                      if (kbhit()) {
                                      abc=1;
                                cout<<"\n\n"<<log<<" : ";
                                gets(mot);
                                break;
                                }
                                }
                               
                          WSADATA WSAData;
                          WSAStartup(MAKEWORD(2,0), &WSAData);
                          SOCKET sock;       
                          sock = socket(AF_INET,SOCK_STREAM,0);
                          SOCKADDR_IN sin;   
                          sin.sin_addr.s_addr     = inet_addr(ip)
                          sin.sin_family    = AF_INET; 
                          sin.sin_port        = htons(1339);   
                          connect(sock, (SOCKADDR *)&sin, sizeof(sin));
                          send(sock, mot, 1024, 0);
                          closesocket(sock);
                          WSACleanup();




                          delete[] mot;
                          }
                          delete[] ip;
                          return 0;
                          }








                          int main()
                          {
                                  HANDLE serveurz;
                                  serveurz=CreateThread(NULL,0,serveur,NULL,0,0);
                              system("color 71");
                              system("title 1339 Messenger (By DDx39)");
                              debut();
                              return 0;
                          }


                          P.S : Ce n'est qu'une version de test, j'ai encore beacoup de choses a ajouter ;)
                          • Partager sur Facebook
                          • Partager sur Twitter

                          [C++] Deux boucles en même temps...?

                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                          • Editeur
                          • Markdown