Buffer[1024] leeren



  • Hi,

    Ich arbeite grade mit Sockets und habe es mittlerweile geschafft, eine Verbindung zwischen dem Server und Clienten herzustellen...

    Jedoch funktioniert etwas nicht so wie ich es will:

    Client: Huhu!
    Server: Huhu! - Bis dahin ist alles perfekt...
    Client: Wie geht´s?
    Server: ╗╗╗╗╗╗╗╗╗╗╗
    Client: Was?
    Server: ╗╗╗
    usw...

    Server:

    //Empfangen:
    rc=recv(clients[i],buf,strlen(buf),0);
    //Senden:
    std::cout << "Client ( " << i << " ) : " << buf << std::endl;
    // antwort senden
    send(clients[i],buf,strlen(buf),0);
    

    Client:

    //Einlesen des Strings
    std::cout << "Client: ";
    std::cin.getline(buf,1024);
    //Senden des Strings
    send(s,buf,strlen(buf),0);
    //Empfangen des Strings vom Server
    rc=recv(s,buf,strlen(buf),0);
    

    Ich bin mit dem Debugger öfters durchgegangen und habe bemerkt, dass der Server den buffer
    [0]: 'H'
    [1]: 'a'
    [2]: 'l'
    [3]: 'l'
    [4]: 'o'
    [5]: '\0'
    [6]: ╗ (52) //oder so
    [7]: ╗ (52)
    //...

    bekommmt, sprich anscheinend wird die Null-Terminierung übersprungen?
    Ich bin mit meinem Latein echt am Ende, wäre sehr dankbar wenn mir jemand helfen könnte.

    Wenn die Informationen nicht reichen bitte sagen.

    Lg Fendrich



  • server:

    //const size_t BUFFER_SIZE = 1024;
    //char buf[BUFFER_SIZE];
    
    //int rc
    
    //Empfangen:
    rc = recv(clients[i], buf, BUFFER_SIZE, 0);
    if(rc < 0)
    //fehlerbehandlung - disconnect oder so
    
    int buf_length = rc;
    //Senden:
    std::cout << "Client ( " << i << " ) : " << std::string(buf, buf+buf_length) << std::endl;
    
    // antwort senden
    send(clients[i], buf, buf_length, 0);
    

    client:

    //Einlesen des Strings
    std::cout << "Client: ";
    std::cin.getline(buf,1024);
    int buf_length = std::cin.gcount();
    
    //Senden des Strings
    send(s, buf, buf_length, 0);
    

    bb

    PS: Dir ist bekannt, dass man auch größere Teile schicken kann als der Empfangs-Buffer groß ist - siehe dazu GetLastError() oder so was in der Richtung...
    edit: http://msdn.microsoft.com/en-us/library/ms740121(VS.85).aspx
    WSAGetLastError() == WSAEMSGSIZE: http://msdn.microsoft.com/en-us/library/ms740668(VS.85).aspx#winsock.wsaemsgsize_2

    also so in etwa:

    const size_t BUFFER_SIZE = 1024;
    
    std::string received;
    for(char buf[BUFFER_SIZE]; ; )
    {
      int length = recv(clients[i], buf, BUFFER_SIZE, 0);
      if(length == SOCKET_ERROR)
      {
        int error_code = WSAGetLastError();
        if(error_code == WSAEMSGSIZE)
        {
          received += std::string(buf, buf+BUFFER_SIZE);
          continue;
        }
        std::cout << "FEHLER" << std::endl;
        return;
      }
      received += std::string(buf, buf+length);
      break;
    }
    
    std::cout << "Client ( " << i << " ) : " << received << std::endl;
    
    for(size_t i(0), length(received.size()); i != length;
    {
      int sended = send(clients[i], received.c_str()+i, static_cast<int>(length-i), 0);
      if(sended == SOCKET_ERROR)
      {
        std::cout << "FEHLER" << std::endl;
        return;
      }
      i += sended;
    }
    

    das empfangen beim client analog zum empfangen beim server...



  • Vielen Dank für deine Hilfe!



  • Fendrich schrieb:

    Vielen Dank für deine Hilfe!

    ich hoffe, du hast es verstanden!? ^^
    falls nicht, trau dich ruhig, zu fragen


Log in to reply