Pb clients serveur

[Résolu]
Signaler
Messages postés
97
Date d'inscription
dimanche 6 juillet 2003
Statut
Membre
Dernière intervention
20 janvier 2008
-
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
-
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.

3 réponses

Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
3
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.
Messages postés
97
Date d'inscription
dimanche 6 juillet 2003
Statut
Membre
Dernière intervention
20 janvier 2008

OK merci beaucoup !


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



Melkior le necrarque
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
3
Salut,

En TCP, non.