Stackoverflow Java-Applet an C++-Server



  • Hallo!
    ich habe einen minimalen Server gebaut, der HTTP-Responses kann, mehr erst mal nicht. Ich habe ihn mit dem Client Firefox erfolgreich getestet. Sobald aber ein Java-Applet mir Daten senden will (die ich mit recv auffange), wird eine Exception geworfen: "Stack around the variable 'c' was corrupted."

    Der Visual Studio Debugger sagt, hier:

    bool tcp_server::recv_from(const int sock, std::string &s) {
    	char c[500];
    	int len = ::recv(sock, c, 499, 0);
    	c[len] = '\0';
    	s = c;
    	return true;
    }
    

    Nun kann man maximal 499 Bytes empfangen, das letzte ist für die Nullterminierung. Bei der Zuweisung s = c (s ist ein std::string) wird die Exception von der CRT geworfen. Im C-Array sind 512 (!) Elemente zu sehen, allesamt ASCII-Müll.
    Das JavaApplet sendet eigentlich nur so:

    try 
      {
       Socket skt = new Socket("90.136.135.38", 80);
       BufferedReader in = new BufferedReader(new
       InputStreamReader(skt.getInputStream()));
       System.out.print("Received string: '");
       while (!in.ready()) {}
       PrintWriter out = new PrintWriter(skt.getOutputStream(), true);
       out.print("Hallo Wie gehts denn so \0");
       System.out.println(in.readLine()); // Read one line and output it
       System.out.print("'\n");
       in.close();
      }
      catch(Exception e) 
      {
       System.out.print("Whoops! It didn't work!\n");
      }
    

    Anmerkung: Nicht mein Code. 🙂

    Ist der Fehler im Java-Code zu finden? Ich habe ihn net geschrieben, aber Clients, die mit C(++) gemacht sind, laufen einwandfrei, u.a. auch IE und Firefox. 😕



  • Warum willst du Nullterminieren? Und warum gibst du nicht den String als Rückgabewert zurück? Statt Errorchecking per Returnvalue würde ich es in Erwägung ziehen einfach eine Exception zu werfen.

    So wäre mein Ansatz:

    void tcp_server::recv_from(SOCKET sock, std::string& s)
    {
        std::vector<char> buffer(500);
        int readBytes = recv(sock, &buffer[0], buffer.size(), 0);
    
        std::string readString(reinterpret_cast<const char*>(&buffer[0]), readBytes);
        s = readString;
    }
    

    Ja, unschön den char* zu const zu casten, aber was solls. Denke nicht dass man dabei auf die Fresse fallen kann. Dafür hast du einen size-terminated string (Stell dir vor ein Client schickt dir ne '0' im Request. Würde deinen Server total verwirren) und vector ist doch besser zum Arbeiten als diese schrecklichen char-Arrays.


Anmelden zum Antworten