Eigene Socket-Klasse mit wxWidgets



  • Hallo,

    ich schreibe gerade eine Anwendung, in der es nötig ist, einen HTTP-Request zu einem Server zu schicken. Zuerst hab ich mit wxSocketClient gearbeitet, allerdings hat das Verbinden etc. bei einer lokalen Verbindung schon Ewigkeiten gedauert. Also hab ich meine eigene Klasse geschrieben.
    Die Klasse funktioniert eigentlich ganz gut, es hapert nur an der "ReceiveBytes()" -Funktion:

    wxString Socket::ReceiveBytes() 
    {
      char buf[1024];
      wxString buffer;
      while (1) 
      {
        u_long arg = 0;
        if (ioctlsocket(s_, FIONREAD, &arg) != 0)
          break;
    
        if (arg == 0)
          break;
    
        if (arg > 1024) arg = 1024;
    
        int rv = recv (s_, buf, arg, 0);
        if (rv <= 0) break;
    
        wxString t = wxString(buf, *wxConvCurrent, rv);
    
        buffer += t;
      }
    
      return buffer;
    }
    

    Das Problem ist: der wxString buffer ist leer, wenn er zurückgegeben wird. Aufgerufen wird das ganze übrigens so:

    wxString SendRequest(wxSocketClient &cli, wxString server, wxUint16 port, wxString header)
    {
    	wxString ret = wxT("");
    	SocketClient s(server, port); //Socketclient ist abgeleitet von Socket
    	s.SendBytes(header);
    	ret = s.ReceiveBytes();
    	s.Close();
    
    	return ret;
    }
    

    Und im Hauptprogramm:

    wxString header = wxString::Format(wxT("GET %s%s HTTP/1.1\r\nHost: %s\r\nConnection: close\r\nCookie: %s\r\n\r\n"),
    			path, file, server, CookieToSend);
    		response = SendRequest(sock, server, 80, header);
    		this->out->AppendText(response);
    

    In die TextBox wird jedoch nichts geschrieben.

    Mein Apache sagt mir, dass der Request richtig gemacht wurde, es werden auch Daten zurückübertragen.

    Weiß einer woran das liegen könnte?
    Danke schon mal.

    Gruß pyro


  • Mod

    Hm, ka. Also ich würde es eigentlich mit wxSocket oder mit wxHTTPEngine von wxCode versuchen.
    Ansonsten gibts natürlich noch andere Netzwerklibs, wie z.B. boost::asio, da ist auch ein HTTP Beispiel in den examples.



  • Rückgabewert von recv() wird nicht (richtig) beachtet.



  • autsch stimmt 😕
    recv liefert ja null zurück, wenn der gegenseitige Socket geschlossen wird. Da ich aber "Connection: close" schicke, wird die Antwort verworfen, so wie ich das sehe, oder?


  • Mod

    Dann müsstest du Clientseitig das in deinem Protokollhandler einbauen, das er bei "Connection: close" die Verbindung schließt.


Anmelden zum Antworten