2010-11-28 8 views
0

Meine Anwendung stürzt ab, wenn ich versuche, den Puffer zu drucken. Ansonsten funktioniert es gut. Dieser ist der Code:Wie gebe ich ein Zeichen von einer Funktion zurück, die Winsock zum recv vom Sockel verwendet?

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); 
     } 

Antwort

0

Wenn Sie das erste Zeichen drucken möchten

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

verwenden Wenn Sie die gesamte drucken möchten, dann sollten sockread den gesamten Puffer zurückgeben, nicht das erste Zeichen. Dazu müssen Sie die Adresse des ersten Elements des Puffers zurückgeben, das in diesem Fall bereits dynamisch zugewiesen werden sollte.

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

bearbeiten Nach einigem Nachdenken Ich glaube, Sie letztere wollen, dass die in der folgenden Art und Weise sockread() Funktion ändern:

  • Änderung des Rückgabetyp von char zu char* oder besser const char*
  • char buffer[DEFAULT_BUFLEN]; bis char* buffer = new char[DEFAULT_BUFLEN];
  • return *buffer zu return buffer

Auch in diesem Fall nicht vergessen die Puffer

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

hth

+0

Entschuldigung, ich verstehe nicht. Mache ich das nicht schon? – thorvald

+0

@thorvald: Nein, eigentlich gibst du nur das erste Zeichen zurück. Siehe meine Bearbeitung –

+0

Sie geben ein einzelnes Zeichen zurück (das erste Zeichen in Ihrem Puffer) und Sie versuchen, dieses Zeichen als String (ein Null beendet char *) – nos

0

Sie müssen löschen std :: string verwenden. Sie können diesen Puffer nicht zurückgeben - er befindet sich auf dem lokalen Stapel. Selbst wenn es Ihnen gelungen ist, einen tatsächlichen Zeiger auf sie anstatt nur eines einzelnen Zeichens zurückzugeben, was Sie getan haben, wäre es außerhalb des Gültigkeitsbereichs und der darin enthaltenen Daten ungültig.

Std :: String kümmert sich um all diese Probleme. Du benutzt es einfach, und es ist fertig. Sie haben auch andere Probleme, wie die ungültige Rückgabe eines Puffers, wenn er tatsächlich fehlgeschlagen ist. Dafür gibt es Ausnahmen.

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

Ich habe dieses Beispiel versucht, aber es druckt nichts, wenn ich es von der Hauptfunktion aus rufe. Std :: Zeichenfolge s; an Größe (512); s = client.sockread(); printf ("% s \ n", s); aber es druckt immer "Ìü". Das Beispiel in der anderen Antwort funktioniert. – thorvald

+0

@thorvald: THat's, weil du std :: cout verwenden sollst, wie ich gezeigt habe, nicht printf. Außerdem müssen Sie die Zeichenfolge außerhalb der Funktion nicht ändern. Sie können einfach 'std :: cout << client.sockread();' oder 'std :: string s = client.sockread();'. – Puppy

+0

Es kompiliert nicht, wenn ich std :: cout verwende. Fehler C2679: binäre '<<': kein Operator gefunden, der einen rechten Operanden vom Typ 'Std :: String' (oder es gibt keine akzeptable Konvertierung) – thorvald

Verwandte Themen