melkiorlenecrarque
Messages postés97Date d'inscriptiondimanche 6 juillet 2003StatutMembreDernière intervention20 janvier 2008
-
15 oct. 2005 à 15:22
cs_aardman
Messages postés1905Date d'inscriptionmercredi 22 janvier 2003StatutMembreDernière intervention17 septembre 2012
-
15 oct. 2005 à 17:04
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);
cs_aardman
Messages postés1905Date d'inscriptionmercredi 22 janvier 2003StatutMembreDernière intervention17 septembre 20123 15 oct. 2005 à 16:20
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.