2017-03-29 2 views
-2

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; 
    } 
    } 
+2

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. –

+0

Pourquoi le code tente-t-il une comparaison arithmétique sur les pointeurs avec une requête char *? ... if ((request = ...) <= 0) {'? – chux

+0

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. –

Répondre

1

Je ne peux pas trouver où mon code se coincent dans cette fonction

Il ne « se coincer ». Il boucle pour toujours, parce que vous ne lisez rien, parce que vous avez utilisé MSG_PEEK. Solution: ne pas.

NB if(numbytes != strlen(request)){ n'a aucun sens. Il n'y a aucune garantie que request soit jamais terminé par un zéro: dans tous les cas, le test semble inutile.

+2

De plus, la lecture de 'sizeof (request)' nombre d'octets est fausse, puisque 'request' est un pointeur' char * '. Vous devriez lire le nombre total d'octets 'total', puis définir' request [numbytes] = 0' si vous prévoyez d'utiliser 'strlen()' (qui serait redondant puisque 'strlen()' serait alors toujours égal à 'numbytes', sauf si les données ont des zéros incorporés) –

0

Je pense que votre desing logiciel est mauvais, pourquoi il y a tout (1), lorsque vous appelez recv (s, demande, sizeof (demande), MSG_PEEK)) vous obtiendrez nombre d'octets dans la file d'attente recv, alors vous devez lire les octets du tableau. Si vous ne lisez pas, la file d'attente recv surcharge et while (1) ne finira jamais