[Problem] Wie lese ich alles was der Server sendet aus,via recv / Probleme mit meinem Code



  • Hallo 🙂
    Also ich schreibe gerade ein paar Netzwerk Funktionen,eine davon sollte die
    gesammte Antwort des Servers (z.B. bei einem HTTP-GET den Source einer Seite)
    in einen String schreiben und ihn dann zurückgeben,der Code:

    string receive_message(void)    
    {
    string received;
    char buf[MAX_SIZE];
    
    do{
       rc = recv(s,buf,MAX_SIZE,0);
        if(rc==0)
        {
         error_b = 1 ;
         error += "Disconnected!\n";
        }
        if(rc==SOCKET_ERROR)
        {
         error_b = 1 ;
         error += "Recv failed!\n";
        }
        received += buf;
    
     cout << rc << endl;    
    }while(error_b == 1 || rc >= MAX_SIZE);    
    
    return received;    
    }
    

    Dort lass ich mir rc ausgeben,er gibt einmal 1204 und dann 236 aus,wobei
    die Schleife abbricht da MAX_SIZE 1024 ist!
    Lass ich mir dann received ausgeben ist das aber bei weitem nicht der gesammte
    Code der Seite...Warum empfange ich beim 2. Mal nur noch 236 Bytes?Normalerweise
    sollte ich doch solange 1024 empfangen bis ich fast alles ausgelesen hab,dann
    sollte ich weniger also 1024 auslesen,eben weil nichts mehr da ist,und dann erst
    abbrechen...
    Aber dem ist leider nicht so!
    Was mich noch stutzig mach ist das

    cout << get.length();
    

    2050 ausgibt o.O 😕
    Wär echt schön wenn mir jemand sagen kann was es damit auf sich hat und wie ich
    alles auslesen kann 🙂

    Danke im voraus

    Hier nochmal der gesammte Code:

    #define _WIN32_WINNT 0x0500
    #include <string>
    #include <iostream>
    #include <windows.h>
    #include <winsock2.h>
    #define MAX_SIZE 1024
    using namespace std;
    
    int startWinsock(void);
    long getAddrFromString(char* ,SOCKADDR_IN* );
    
             void send_message(char* );
             string receive_message(void);
             void start(char*,int);
             string error;
             int error_b;
             long rc;
             SOCKET s;
             SOCKADDR_IN addr;
             char buf[256];
             string get;
    
    int main(void)
    {
    
    cout << "Starting Winsock...";
    startWinsock();
    cout << "Done\n\n";
    
    cout << "Connecting...";
    start("google.de",80);
    cout << "Done\n\n";
    
    cout << "Sending...";
    send_message("GET / HTTP/1.1\nHost: www.google.de\n\n");  /* <== */
    cout << "Done\n\n";
    
    cout << "Receiving...\n\n";
    get = receive_message();  /* <== */
    cout << "\n\nDone\n\n";
    
    cout << get.length();
    cout << get;    
    system("PAUSE");  
    return 0;    
    }
    
    /* ************************************************* */
    
    void start(char* hostnameOrIp,int port)
    {
    s=socket(AF_INET,SOCK_STREAM,0);
      if(s==INVALID_SOCKET)
      {
        error_b = 1 ;
        error += "Could not create Socket!\n";
        return ;
      }
    
      memset(&addr,0,sizeof(SOCKADDR_IN)); 
      addr.sin_family=AF_INET;
      addr.sin_port=htons(port); 
      rc=getAddrFromString(hostnameOrIp,&addr);
      rc=connect(s,(SOCKADDR*)&addr,sizeof(SOCKADDR));
      if(rc==SOCKET_ERROR)
      {
        error_b = 1 ;
        error += "Could not connect to server!\n";
      }
    }
    
    /* ************************************************* */
    
    void send_message(char* message)
    {
    rc = send(s,message,strlen(message),0);
      if(rc==SOCKET_ERROR)
      {
        error_b = 1 ;
        error += "Could not send message!\n";
      }
    }
    
    /* ************************************************* */
    
    string receive_message(void)    
    {
    string received;
    char buf[MAX_SIZE];
    
    do{
       rc = recv(s,buf,MAX_SIZE,0);
        if(rc==0)
        {
         error_b = 1 ;
         error += "Disconnected!\n";
        }
        if(rc==SOCKET_ERROR)
        {
         error_b = 1 ;
         error += "Recv failed!\n";
        }
        received += buf;
    
     cout << rc << endl;    
    }while(error_b == 1 || rc >= MAX_SIZE);    
    
    return received;    
    }
    
    /* ************************************************* */
    /* ************************************************* */
    
    int startWinsock(void)
    {
      WSADATA wsa;
      return WSAStartup(MAKEWORD(2,0),&wsa);
    }
    
    /* ************************************************* */
    
    long getAddrFromString(char* hostnameOrIp, SOCKADDR_IN* addr)
    {
      long rc;
      unsigned long ip;
      HOSTENT* he;
    
      if(hostnameOrIp==NULL || addr==NULL)
        return SOCKET_ERROR;
    
      ip=inet_addr(hostnameOrIp);
    
      if(ip!=INADDR_NONE)
      {
        addr->sin_addr.s_addr=ip;
        return 0;
      }
      else
      {
        he=gethostbyname(hostnameOrIp);
        if(he==NULL)
        {
          return SOCKET_ERROR;
        }
        else
        {
          memcpy(&(addr->sin_addr),he->h_addr_list[0],4);
        }
        return 0;
    
      }
    }
    


  • Die Bedingung

    }while(error_b == 1 || rc >= MAX_SIZE);
    

    sieht falsch aus. Brich die Schleife ab, wenn recv 0 oder SOCKET_ERROR liefert.



  • Danke scheint alles zu klappen 🙂



  • Schnellschuss 😃
    Tut mir leid wegen dem Doppelpost aber gerade merke ich das er immer noch nicht alles bekommt/ausliest.
    Bei der einen Seite ist get.length() 6150,bei der anderen 19475,aber den gesammten Inhalt bekomm ich nie 😞
    Die Funktion:

    string NetSocket::receive_message(void)    
    string received;
    char buf[MAX_SIZE];
    int lol;
    do{
       rc = recv(s,buf,MAX_SIZE,0);
       lol += rc;
        if(rc==SOCKET_ERROR)
        {
         error_b = 1 ;
         error += "Recv failed!\n";
        }
    
         received += buf;
    
    }while(rc != 0 && rc != SOCKET_ERROR );    
    
    return received;    
    }
    

    Schon mal vielen Dank 🙂



  • Las dir das öfter zu senden und recv sollange bis das klappt, das könnte unter umständen deinen Fehler beheben.
    Weiterhin wenn du den buffer ausgibst steht da Müll drinne, wenn ja setze im buffer an der position rc '\0'



  • du musst die append memberfunktion von string nehmen oder den buffer null terminieren.



  • Meinte ich doch



  • Dieser Thread wurde von Moderator/in evilissimo aus dem Forum C++ in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Danke,jetzt klappt alles 🙂

    *hofftdasesdiesmalwirklichklappt*


Anmelden zum Antworten