Problème avec reception de données par winsock

Résolu
unrealgun Messages postés 87 Date d'inscription mardi 16 décembre 2003 Statut Membre Dernière intervention 4 mars 2008 - 29 déc. 2005 à 16:57
unrealgun Messages postés 87 Date d'inscription mardi 16 décembre 2003 Statut Membre Dernière intervention 4 mars 2008 - 30 déc. 2005 à 18:44
Bonjour,
Je suis sous dev-c++ et je fais un programme qui utilise winsock.
J'ai un probleme au niveau de la réception de commandes :
lorsque je recois beaucoup de données simultanément, mon programme crash, sans message d'erreur, il se ferme.

Puisque lorsque le nombre decommandes est trop grand, la dernière commande se retrouve coupée en 2, j'ai décidé de faire ceci :


char tmpwait[2005];
unsigned long i;

char *mid(char *texte, unsigned int depart, unsigned int fin)
{
static char res[80];
if(depart < 0) depart = 0;
if(fin > strlen(texte)) fin = strlen(texte);
strncpy (res, texte + depart , fin - depart);
res[fin - depart] = '\0';
return res;
}


void sckread()
{
char *cmd, buf[4015];
unsigned int len;
if(strlen(tmpwait))
{
char buff[2005];
len = recv(sock, buff, 2000, 0);
buff[len] = '\0';
strcpy(buf, tmpwait);
strcat(buf, buff);
tmpwait[0] = '\0';
GlobalFree(&tmpwait);
}
else
{
len = recv(sock, buf, 2000, 0);
buf[len] = '\0';
}
if(strcmp(mid(buf, strlen(buf)-1, strlen(buf)), "¦"))
{
i = strlen(buf); while(buf[i] != '¦') i--;
strcpy(tmpwait, mid(buf, i+1, strlen(buf)));
char tmptobuf[2005];
strcpy(tmptobuf, mid(buf, 0, i+1));
strcpy(buf, tmptobuf);
}


// ...

}

Je m'explique.
'¦' est mon caractère de séparation, il se trouve a la fin de chaque commande.
Ici, lorsque le dernier caractère n'est pas un caractere de séparation (la derniere commande est incomplète), je stocke donc la 1ere partie de cete commande dans la variable globale TMPWAIT.
A la prochaine reception (lorsque je recois la 2eme partie de la comande), ce systeme recolle la 1ere partie d ela commande a la 2eme ainsi reçue.

Mon problème est que ce système ne fonctionne pas.
Le prog plante lors de la reception de données de taille supérieure à 2000. Il n'y a aucun message d'erreur et le prog se ferme :s.

Si quelqun pouvait m'indiquer comment remédier a ce plantage ou un autre systeme de reception plus fiable, cela m'aiderait onsidérablement.

Merci d'avance a tous et bonne année.

2 réponses

katsankat Messages postés 571 Date d'inscription vendredi 30 décembre 2005 Statut Membre Dernière intervention 12 juillet 2012 3
30 déc. 2005 à 17:51
char buf[4015]; ... en deux messages de plus de 2000 ça devrait poser problème.
Aussi vérifies que tu n' envoie pas de paquet de + de 8195 car c'est un max défini dans winsock2.h (je dis ça comme ça car j'ai pas vu le reste de ton prog).

Bref, utilises des printf() pour connaitre l' état et l' évolution des valeurs de tes variables buf, buff et tmpwait, afin de débugger ton programme. Ceci pour identifier là ou ça plante et quand ça plante.

Note strrchr() défini dans string.h trouve la dernière occurence d'un caractère dans un string.
3
unrealgun Messages postés 87 Date d'inscription mardi 16 décembre 2003 Statut Membre Dernière intervention 4 mars 2008
30 déc. 2005 à 18:44
ok merci , je vais voir ca
0
Rejoignez-nous