2010-11-28 20 views
0

Mon application plante lorsque j'essaie d'imprimer le tampon. Sinon, ça fonctionne bien. Voici le code:Comment est-ce que je retourne un char d'une fonction qui utilise winsock à recv à partir du socket?

irc.h

class IRC 
      { 
       public: 
         void sockconnect(char * hName, int portNum); 
          void sockwrite(char* sendbuf); 
          char sockread(void); 
          bool connected; 
        private: 
          WSADATA wsaData; 
          SOCKET m_socket; 
          sockaddr_in clientService; 
          LPHOSTENT hostEntry; 

}; 

irc.cc

char IRC::sockread(void) 

    { 
    int result; 
    char buffer[DEFAULT_BUFLEN]; 
     result = recv(m_socket, buffer, DEFAULT_BUFLEN, 0); 

     if (result > 0) { 
      return *buffer; 
       } 
      else if (result == 0) 
       { 
      connected = false; 
       return *buffer; 
       } 
      else { 
     printf("recv failed with error: %d\n", WSAGetLastError()); 
     return *buffer; 
     } 

    } 

main.cc

IRC client; 

while (client.connected == true) { 
    char buffer = client.sockread(); 
     if (buffer == NULL) 
      break; 


     printf ("Buffer: %s\n",buffer); 
     } 

Répondre

0

Si vous voulez imprimer le premier caractère, utilisez

printf ("Buffer: %c\n",buffer); 

Si vous souhaitez imprimer l'ensemble devrait alors revenir sockread le tampon entier, pas le premier caractère. Pour cela, vous devrez retourner l'adresse du premier élément du tampon qui, dans ce cas, devrait déjà être alloué dynamiquement.

printf ("Buffer: %s\n",buffer); 

Modifier Après avoir réfléchi, je pense que vous voulez ce dernier pour que le changement de la fonction sockread() de la manière suivante:

  • changer le type de retour de char à char* ou mieux const char*
  • char buffer[DEFAULT_BUFLEN]; à char* buffer = new char[DEFAULT_BUFLEN];
  • return *buffer à return buffer

En outre, dans ce cas, ne pas oublier de supprimer le tampon

const char* buffer = client.sockread(); //not char buffer as in your code 
printf ("Buffer: %s\n",buffer); 
delete [] buffer; 

HTH

+0

Désolé, je ne comprends pas. N'est-ce pas ce que je fais déjà? – thorvald

+0

@thorvald: Non, en fait vous ne renvoyez que le premier caractère. Voir mon édition –

+0

Vous retournez un seul caractère (le premier caractère dans votre tampon) et vous essayez d'imprimer ce caractère comme une chaîne (un caractère nul terminé *) – nos

0

Vous devez utiliser std :: string. Vous ne pouvez pas retourner ce tampon - c'est sur la pile locale. Même si vous avez réussi à lui renvoyer un pointeur réel au lieu d'un seul caractère, ce que vous avez fait, il serait alors hors de portée et les données qu'il contient seraient invalides. Std :: string prend en charge tous ces problèmes.

Vous l'utilisez simplement, et c'est fait. Vous avez également d'autres problèmes, comme le retour invalide d'un tampon alors qu'en réalité il a échoué. Voilà à quoi servent les exceptions.

std::string IRC::sockread() 
{ 
    std::string s; 
    s.resize(DEFAULT_BUFLEN); 
    int result = recv(m_socket, &s[0], DEFAULT_BUFLEN, 0); 

    if (result > 0) { 
     return s; 
    } else if (result == 0) { 
     connected = false; 
    } else { 
     std::cout << "recv failed with error " << WSAGetLastError() << "\n"; 
    } 
    throw std::runtime_error("Socket connection failed!"); 
} 
+0

J'ai essayé cet exemple mais il n'imprime rien quand je l'appelle de la fonction principale. std :: chaîne s; s.résize (512); s = client.sockread(); printf ("% s \ n", s); mais il imprime "Ìü" à chaque fois. L'exemple de l'autre réponse fonctionne. – thorvald

+0

@thorvald: C'est parce que vous êtes censé utiliser std :: cout, comme je l'ai montré, pas printf. De même, vous n'avez pas besoin de redimensionner la chaîne en dehors de la fonction. Vous pouvez juste faire 'std :: cout << client.sockread();' ou 'std :: string s = client.sockread();'. – Puppy

+0

Il ne compile pas si j'utilise std :: cout. erreur C2679: binaire '<<': aucun opérateur trouvé qui prend un opérande de droite de type 'std :: string' (ou il n'y a pas de conversion acceptable) – thorvald