2010-02-19 6 views
-1

de la pièce ci-dessous du code, pourquoi je reçois lecture Prise pour réponseproblème de programmation Socket en C

int Read(int sock, char *p, int size) 
{ 
    int remain, read=0; 

    remain = size; 
    while (remain > 0) { 

     if ((read = recv(sock, p, remain, 0)) < 0) { 

      /* Error */ 
      return(read); 
     } else if (read == 0 || *p == 0x0a) { 

      /* EOF */ 
      break; 
     } 
     remain -= read; 
     p += read; 
    } 

    return(size - remain); 
} 



while (!done) 
{ 
    printf("***Reading Socket for response***"); 
    rsplen= Read(myVsHandle.sock,(char *)encXMLResponse,MAX_RSP_LEN); 
    if (rsplen < 0) 
    { 
     printf("Internal Communication Error"); 
     return -1; 
    } 
    else if (rsplen >0) 
     printf("Revieved response"); 
     done++; 
     return 0; 
    else if (rsplen == 0) 
    { 
     printf("Reading socket"); 
    } 
+0

Pouvez-vous être plus précis dans votre question? – jkp

+0

Quelle est la question? – Naveen

+0

Je veux savoir si read() échoue alors l'une des trois conditions doit être vraie. Longueur de réponse> 0, = 0 ou <0. Est-il possible que read() continue à attendre en permanence –

Répondre

1

Vous attendez MAX_RSP_LEN octets à lire - y at-il beaucoup d'octets à lire? Peut-être que votre processus est bloqué dans un blocage read().

En outre, selon le type de socket vous recv() ING à partir, il n'y a aucune garantie sur la quantité de données que vous allez lire, donc en particulier la recherche d'une valeur 0x0a peut ne pas fonctionner.

+0

Je peux voir les messages de réponse de longueur inférieure à la MAX_RSP_LEN pourrait être lu avec succès –

-1

Ce:

if ((read = recv(sock, p, remain, 0)) < 0) { 

devrait-elle être

if ((read = recv(sock, p, remain, 0)) > 0) { // Greater then 0, because recv returns the number of bytes received if successful, if it fails -1. 
+2

Umm, votre commentaire est correct, mais la condition vérifie l'erreur, donc ce devrait être '<0'. –

+0

allez, lisez le code !! il est en boucle jusqu'à ce qu'il y ait une erreur ou rien à recevoir. son test est bon: quand 'recv()' renvoie une valeur <0, c'est une erreur, comme le dit le commentaire dans le code! –

0

Votre problème pourrait être que vous ne terminez pas votre sortie avec un saut de ligne. Essayez de terminer vos sorties avec une nouvelle ligne (\n). stdout est mis en mémoire tampon, de sorte que vous ne voyiez peut-être rien pendant longtemps si vous ne produisez pas de retour à la ligne.

Une autre possibilité est que vous ne reveniez pas de Read() sauf si vous avez lu le nombre d'octets spécifié. En fonction de la valeur de MAX_RSP_LEN et de la quantité de données disponibles, Read() peut attendre indéfiniment.

De même, votre test: *p == 0x0a semble suspect. Que testez-vous ici?

Modifier: Il y a un autre "bug":

else if (rsplen >0) 
    printf("Revieved response"); 
    done++; 
    return 0; 
else... 

Il vous manque des accolades. Dans le formulaire actuel, le code ne doit pas compiler. S'il vous plaît poster le code réel.

+0

Ce code est compilé et fonctionne correctement pour de nombreux messages. Je me demande pourquoi il continue d'attendre une période infinie. Si read peut lire même un message de zéro octet alors le printf correspondant devrait être exécuté –

+0

Comme je l'ai dit, vous ne terminez pas votre sortie avec un retour à la ligne. Donc, même si l'appel 'printf()' est appelé, vous ne verrez aucune sortie. –

+0

@Sachin: aussi, est-ce le code actuel? Il vous manque des accolades, mais cela ne permet pas de compiler. S'il vous plaît poster un code réel. –

-1

vous manque accolades autour du:

else if(rsplen > 0) 
    ... statements 

Il devrait être:

... 
}else if (rsplen >0){ 
    printf("Revieved response"); 
    done++; 
    return 0; 
} ... 
+0

C'est probablement une erreur due à la saisie du code ici sur SO, au lieu de poster du code réel. Sinon, le prochain 'else' est une erreur de syntaxe. –

+0

J'ai déjà dit que cela fonctionnait bien pour la plupart des cas dans un système en ligne –

+0

Oh, merci pour le downvote, j'apprécie vraiment le retour: je veux dire, personne n'avait repéré cette erreur et il y avait comme quatre réponses demandant Plus d'information. – James