Hi J'ai conçu un code pour obtenir la longueur des données inconnues arrivant dans le socket J'ai besoin d'aide car je ne trouve pas où mon code reste bloqué dans cette fonction. Merci pour toute aideProgrammation de socket C recevant la longueur de données inconnue
int recvlen(int s){ //peak all received data and returns the length
char *request;
int total;
total= 1024;//initial size
int numbytes;
printf("\n entered recvlen\n");
while(1){
if((request= (char *)realloc(request,sizeof(char)*total+1)) <=0){
fprintf(stderr,"error in realloc no memory or fail");
return -1;
}
if((numbytes= recv(s,request,sizeof(request),MSG_PEEK))==-1){//get request
fprintf(stderr,"\n error in receiveall \n");
free(request);
return -1;
}
if(numbytes != strlen(request)){
total = numbytes+1;
free(request);
printf("\n recvlen returned total: %d\n",total);
return total;//when the size is found
}
total += total;
}
}
Si vous ne savez pas combien de données sont envoyées, comment voulez-vous savoir quand arrêter de les lire? Quel protocole implémentez-vous qui ne permet pas de le savoir? Même si votre boucle de lecture n'avait pas de défaut de logique (ce qui est le cas), elle resterait en boucle pour toujours, à moins que 'recv()' échoue. Est-ce que vous vous attendez à arrêter de lire quand il signale une erreur 'EWOULDBLOCK', par exemple? Vous pouvez utiliser 'ioctrl (FIONREAD)' sur * Nix, ou 'ioctrlsocket (FIONREAD)' ou 'WSAIoctl (FIONREAD)' sous Windows, pour connaître le nombre d'octets actuellement en attente sur le socket sans avoir à les lire. –
Pourquoi le code tente-t-il une comparaison arithmétique sur les pointeurs avec une requête char *? ... if ((request = ...) <= 0) {'? – chux
je vous remercie pour votre aimable commentaire, @RemyLebeau Je construisais un serveur proxy et essayait d'obtenir une longueur inconnue pour la demande du client. Donc je voulais concevoir recv() qui peut obtenir une longueur de texte inconnue. @ chux J'ai tenté une comparaison arithmétique pour voir si realloc renvoie 0 en cas d'échec de l'allocation de la mémoire. –