begin process at 2012 05 29 18:02:54
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Au secours

 > 

pb clients serveur


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

pb clients serveur

samedi 15 octobre 2005 à 15:22:26 | pb clients serveur

melkiorlenecrarque

Membre Club
Bonjour,

Je programme actuellement un tchat pour reseau local.

pour cela, les clients communiquent avec le serveur et vice versa grace à un code placé en debut de chaine à envoyer genre
envoi au serveur de :"#800 old#tartenpion" // modifier le pseudo old en tartenpion puis prevenir tous les clients.( Est-ce une bonne idée?)
Le probleme est que lorsqu'un client est accepté par le serveur, il envoi son pseudo et le serveur le valide et le met sous un format precis:il rajoute des informations que lui seul possede, et renvoi le pseudo validé au client concerné ,puis envoi la liste des autres clients et la, le client recoit les 2 messages d'un coup !! ou alors il ne les recoit pas du tout, c'est aléatoire.

Que faire? utiliser des thread? voici un bout de code:


//coté serveur

BOOL ReceiveData()
{
    char data[800];
    ZeroMemory(data, 800);

    for( int i = 0 ; i <= IndexClient ; i++ )
    {
        recv(Client[i].sock, data, sizeof(data), NULL);
        if( lstrcmpi(data, "") != 0 )
            break;
    }
   
    if( strstr(data, "#900") != NULL )//reception du nouveau pseudo non formaté
    {
        int l = strlen(data);
        char buffer[800];
        ZeroMemory(buffer, 800);
       
        for( int j = 5 ; j<=l ; j++ )
            buffer[j-5] = data[j];
        lstrcat(buffer, " (");
        lstrcat(buffer, Client[i].chambre);
        lstrcat(buffer, ")");

        char mess[800];
        ZeroMemory(mess, 800);

        lstrcpy(mess, "#800 ");
        lstrcat(mess, buffer);
        SendData(Client[i].sock, mess);
       
        if( lstrcmpi(Client[i].pseudo, "") == 0 )//detection nouveau client
        {
            lstrcpy(mess, "#801 ");
            lstrcat(mess, buffer);
            lstrcat(mess, "#");
            SendToAll(mess, Client[i].sock);
           
            lstrcpy(Client[i].pseudo, buffer);   
           
            ZeroMemory(buffer, 800);
            lstrcpy(buffer, "#801 ");               
            for( int j = 0 ; j <= IndexClient ; j++ )
            {
                if( (i != j) && (Client[j].sock != 0) )
                {
                    lstrcat(buffer, Client[j].pseudo);
                    lstrcat(buffer, "#");
                }               
            }
            if( IndexClient > 1 )
                SendData(Client[i].sock, buffer);

            LVITEM item;

            item.mask = LVIF_TEXT;
            item.iItem = i;
            item.iSubItem = 0;
            item.pszText = Client[i].pseudo;
            ListView_InsertItem(List, &item);
            item.iSubItem = 1;
            item.pszText = Client[i].chambre;
            ListView_SetItem(List, &item);
            item.iSubItem = 2;
            item.pszText = Client[i].nom;
            ListView_SetItem(List, &item);
           
            UpdateWindow(List);
        }
        else//changement de pseudo
        {
            lstrcpy(mess, "#802 ");
            lstrcat(mess, Client[i].pseudo);
            lstrcat(mess, "#");
            lstrcat(mess, buffer);
            SendToAll(mess, Client[i].sock);

            lstrcpy(Client[i].pseudo, buffer);           
        }
    }



//coté client:

BOOL ReceiveData()
{
    char data[800];
    ZeroMemory(data, 800);

    recv(sock, data, sizeof(data), NULL);
   
    if( strstr(data, "#800") != NULL )//#800 reception de son propore pseudo formaté
    {
        int l=lstrlen(data);
        ZeroMemory(MyPseudo, 256);

        for( int i = 5 ; i <= l ; i++ )
            MyPseudo[i-5] = data[i];
    }
    if( strstr(data, "#801") != NULL )//#801 reception d'un nouveau pesudo
    {
        int l=lstrlen(data);
        char NewPseudo[256];
        ZeroMemory(NewPseudo, 256);

        int a = 5;
        for( int i = 5 ; i <= l ; i++ )
        {
            if( data[i] == '#' )
            {
                LVITEM item;

                item.mask = LVIF_TEXT;
                item.iItem = NbClient;
                item.iSubItem = 0;
                item.pszText = NewPseudo;
                ListView_InsertItem(List, &item);

                NbClient++;
                ZeroMemory(NewPseudo, 256);
                a = i+1;
            }
            else
            {
                NewPseudo[i-a] = data[i];
            }
        }       
    }
    if( strstr(data, "#803") != NULL )//reception du nouveau pseudo non formaté//#803 reception d'un pseudo à supprimer
    {
        int l=lstrlen(data);
        char Pseudo[256];
        ZeroMemory(Pseudo, 256);

        for( int i = 5 ; i <= l ; i++ )
            Pseudo[i-5] = data[i];

        LVFINDINFO InfoSearch;
        ZeroMemory(&InfoSearch, sizeof(LVFINDINFO));
                         
        InfoSearch.flags = LVFI_PARTIAL;
        InfoSearch.psz = (LPTSTR)Pseudo;
        int result = ListView_FindItem(List, -1, &InfoSearch);
        ListView_DeleteItem(List, result);
       
        UpdateWindow(List);

        NbClient--;
    }
   
    return TRUE;
}

BOOL EnvoiPseudo(char* buffer)
{
    char data[256];
    ZeroMemory(data, 256);
    lstrcpy(data, "#900 ");
    lstrcat(data, buffer);

    SendData(data);

    return TRUE;
}






Merci

PS j'utilise winsock2 et WSA.

samedi 15 octobre 2005 à 16:20:30 | Re : pb clients serveur

aardman

Membre Club
Réponse acceptée !
Salut,
C'est a toi de le gerer dans ton code.
Lorsqu'on utilise TCP, il n'y a aucune garantie que 1 send == 1 recv, autrement dit tu peux recevoir des messages incomplets ou au contraire plusieurs messages d'un coup.

Le protocol IRC par exemple, pour gerer cela, ajoute la sequence \r\n entre chaque message/commande envoyées. Il est alors facile d'extraire les messages de ce que tu recois.
samedi 15 octobre 2005 à 16:46:44 | Re : pb clients serveur

melkiorlenecrarque

Membre Club

OK merci beaucoup !

Mais est-il possible que des messages se "perdent" ?




Melkior le necrarque

samedi 15 octobre 2005 à 17:04:45 | Re : pb clients serveur

aardman

Membre Club
Salut,
En TCP, non.



Cette discussion est classée dans : buffer, data, client, item, pseudo


Répondre à ce message

Sujets en rapport avec ce message

probleme serveur-client [ par dorian2031 ] ben voila le probleme, dans mon serveur-clientmon client envoi bien un message avec : char buffer[1024]="slt a toi\0";.... send(serveur,buffer,1024, client serveur [ par elanspeech ] Bonjour,Je suis en train de programmer un petit client serveur en C pour windows avec dev-c++. J'obtiens l'erreur suivante a la compilation : D:\DEV-C jouer data depuis Buffer Audio ? [ par cybermax62 ] bjr, je veux jouer de l'audio issu d'une video .avi. en fait c pour jouer une video sur une surface DDraw, mais bon c pas important ca.j'utilise vfw32 Problème chat c++ - impossible de se connecter plusieurs fois...!!! [ par benoitt76 ] Bonjour à tous, Je débute en c++, et il est vrai que j'ai un peu de mal. J'essaie de développer un chat avec c++ builder 4 et j'ai un petit souci...J Problème de sockets... [ par nightlord666 ] Bonjour ! J'essaie en ce moment de programmer un serveur multithread qui servira(peut-être) à un projet de MMORPG. Le serveur fonctionne normalement, fermeture de socket [ par darkkinj ] Je me trouve face à un problème de protection pour mon application serveur. Le serveur est sur un thread correspondant à un client en boucle (quasi)in lecture fichier binaire [ par SesechXP ] Salut !Je cherche à lire des données dans un fichier binaire afin de les réafficher en ascii.Voici la tête du fichier à lire @10004A 75 6C 69 65 6E FF Webcam Client Serveur Data Packets [ par c0nsur ] Bonjour, J'aimerais savoir comment on peu avoir accès directement à une webcam car j'aimerais  etre capable de diffuser en stream continu la webcam d' chat client server [ par electroonn ] Bonjour, j'essaye de developper avec c++ une application de chat (client-server) sous windows, en voici le code:Server server; Client client; void m Erreur de tansmission (octet manquant) [ par makmibad ] Bonjour, je suis en train de développer un client serveur sous C++ et je rencontre des difficultes lors de la mise en oeuvre du serveur, je m'explique


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,842 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales