unrealgun
Messages postés87Date d'inscriptionmardi 16 décembre 2003StatutMembreDernière intervention 4 mars 2008
-
30 déc. 2005 à 13:51
unrealgun
Messages postés87Date d'inscriptionmardi 16 décembre 2003StatutMembreDernière intervention 4 mars 2008
-
1 janv. 2006 à 04:22
Bonjour,
je suis entrain de developper un eaplication utilisant winsock sous windows avec Dev-c++.
Je voudrais connaitre la taille de la file d'attente du sock pour pouvoir récuperer tout son contenu en 1 seule fois avec RECV.
Merci d'avance et bonne année.
cs_aardman
Messages postés1905Date d'inscriptionmercredi 22 janvier 2003StatutMembreDernière intervention17 septembre 20123 30 déc. 2005 à 19:43
Salut,
Ecrire 'je comprend rien' en gros c'est pas ca qui debuguera ton programme.
Regardes ce que tu fais: recv(sock, NULL, length, MSG_PEEK); tu ne
passes meme pas l'adresse du buffer, pas etonnant que ca plante..
Aussi dans ton code, le free ne sert a rien puisque la variable buff n'a pas été alouée avec malloc.
Moi j'aurais fait un truc de ce genre (à tester):
char buffer[2000];
int r;
r = recv(sock, buffer, 2000, MSG_PEEK); // on lis les données
while(r > 0 && buffer[r] != '|')
r--;
// trouve le dernier | dans le buffer
if(r > 0)
{
recv(sock, buffer, r, 0);
// ici buffer contient des commandes completes terminées par |.
}
Je ne suis pas chez moi donc je ne peux pas tester (compiler) ton code
ou mon exemple pour voir si ca marche vraiment, donc c'est a prendre
avec des pincettes.
unrealgun
Messages postés87Date d'inscriptionmardi 16 décembre 2003StatutMembreDernière intervention 4 mars 2008 30 déc. 2005 à 14:33
bein en fait, j'envoie des commandes a trevers winsock, a la fin de chaque commande j'ai un caractere de séparation mais, lorsque je recois beaucoup de commandes, le buffer ne peut pas tout récupérer et la dernière commande se retrouve coupée en 2.
Vous n’avez pas trouvé la réponse que vous recherchez ?
le principe c'était de conserver la 1ere partie de la commande coupée et d'attendre la 2eme pour la recoller mais bizarrement, a la fin, il me manque des commandes.
DeAtHCrAsH
Messages postés2670Date d'inscriptionvendredi 25 janvier 2002StatutMembreDernière intervention 6 février 2013 30 déc. 2005 à 14:47
Dans ce cas la ne prend en compte que les commandes completes c'est a dire celle qui se termine par |
Celle qui est incomplete bufferise la dans une variable globale, et lors de la prochaine récéption du socket tu pourras la completer.
Une autre solution est de bouclé sur le recv tant qu'il y a des cotets a lire.
cs_aardman
Messages postés1905Date d'inscriptionmercredi 22 janvier 2003StatutMembreDernière intervention17 septembre 20123 30 déc. 2005 à 17:07
Salut,
Tu peux avoir la taille du buffer de reception d'un socket avec getsockopt() et le flag SO_RCVBUF.
Cependant ca ne resoudra pas ton probleme, le principe de ton algo est
bon donc c'est plutot lui qu'il faudrait chercher à travailler.
Sinon il y a une autre idée, c'est d'utiliser recv() avec le flag
MSG_PEEK. Utilisé avec ce flag, recv() va lire les données du buffer de
reception SANS les suprimer, donc ca te permet de calculer combien de
commandes complete tu as recues, et donc de determiner combien d'octet
tu dois lire afin de ne pas lire de 'morceaux' de commandes. Lorsque tu
as calculé cette valeur, un recv() sans MSG_PEEK enlevera les
octets des commandes completes et ne laissera que les morceaux
incomplets dans le buffer (qui seront completés par la suite).
n_o_u_n_o_u
Messages postés14Date d'inscriptionlundi 23 février 2004StatutMembreDernière intervention14 février 2006 31 déc. 2005 à 00:32
Bonsoir,
pourquoi ne pas transférer ce que tu reçois du winsock dans une variable à côté de ton buffer de réception.
Cette variable te servirait à concaténer les informations reçues par ton contrôle winsock afin de reconstruire les informations
intéressantes pour ton programme : ces informaitons serait encadrées par une base de début et une balise de fin et par conséquent facilement exploitables. Après, cela dépend du protocole que tu utilises (UDP ou TCP)...
cs_aardman
Messages postés1905Date d'inscriptionmercredi 22 janvier 2003StatutMembreDernière intervention17 septembre 20123 31 déc. 2005 à 01:04
Salut,
Un prog qui "crash sans afficher de message d'erreur" c'est impossible
a debuguer. C'est a toi d'afficher les erreurs et le contenu de tes
variables afin d'etre capable, lors de l'execution du programme, de
bien visualiser ce que le code fait, et ce qu'il fait mal.