CHttpFile 20s schneller als CSocket???



  • Kommt drauf an.

    Edit: Mr MR war schneller. Aber ich hab die nicht-konstruktivere Antwort gegeben. :p



  • Der Socket ist langsamer nicht das CHttpFile.


  • Mod

    Dann gilt trotzdem die Frage, ob Du beim CSocket nun Zeichen für Zeichenliest oder Blöcke?



  • Ich lese Blöcke



  • Dann zeig mal minimal Bsp. um das Problem nachzuvollziehen.



  • bool CSocketManager::connect()
    {
    	if(connected)
    	{
    		disconnect();
    	}
    
        if(!client_socket.Connect(host,port))
    	{
    		error_text = "Fehler beim Herstellen der Verbindung.\r\n" + get_last_error_message();	
    	}
    	else
    	{
    		connected = true;
    	}
    	return connected;
    }
    
    bool CSocketManager::send(CString data)
    {
    
      if(connected)
      {  
    	  if(data.Find("Host: " + host) <0)
    	  {
    		error_text = "Hostund Url stimmen nicht überein";
    		return false;
    	  }
    	  int rc = client_socket.Send(data.GetBuffer(),data.GetLength());
    	  if(rc == SOCKET_ERROR)
    	  {
    		  error_text = "Fehler beim Senden\r\n" + get_last_error_message();
    		  return false;
    	  }
    	  if(rc != data.GetLength())
    	  {
    		  error_text = "Länger der gesendeten Daten stimmt nicht mit der Menge der vorhandenen Daten überein";
    	      if(!reconnect())
    		  {
    			error_text = "Länger der gesendeten Daten stimmt nicht mit der Menge der vorhandenen Daten überein\r\n" + error_text;
    		  }
    		  return false;
    	  }
    	  return true;
      }
      else
      {
    	  return false;
      }
    }
    
    bool CSocketManager::receive(CString & buffer)
    {
    	char buf[TCP_PACKET_LENGTH];//1460
    	int byte_read = client_socket.Receive(buf,TCP_PACKET_LENGTH);
    	CString helper(buf);
    	buffer = helper.Left(byte_read);
    	return byte_read > 0;
    }
    


  • Die Buffer Grösse TCP_PACKET_LENGTH deutet für mich draufhin, dass Du glaubst es sei nicht möglich einen grösseren Buffer anzugeben - ist es aber, TCP handelt das selbständig ab. Die MTU spielt auf dem Application Level keine Rolle.

    Mit Receive(..) können maximal soviele Daten empfangen werden wie angegeben (Buffer Grösse) ABER es können auch weniger sein - Du musst byte_read auswerten und in einer Schleife Receive(..) immer wieder aufrufen, bis Du genug Daten hast.

    Genug Daten hast Du gemäss einem Protokoll dass DU festlegst oder schon festgelegt ist (durch den verwendeten Dienst). Ich vermute Du verbindest mit einem WebServer - demnach musst Du, gemäss dem HTTP Protokoll, bis "\r\n\r\n" lesen.

    Simon



  • Recieve wird in einer Schleife aufgerufen,bis es false zurück liefert.Und bei HTTP bis zum ersten /r/n/r/n zulesen bringt dir nur den Header.Der Inhalt kommt danach.



  • Und bei HTTP bis zum ersten /r/n/r/n zulesen bringt dir nur den Header.Der Inhalt kommt danach.

    Stimmt da hab ich etwas abgekürzt. 🕶

    EDIT
    Deine receive(..) Methode ist trotzdem supekt. buf ist nicht initialisiert und den übergibst Du anschliessen dem Ctor des CString's, welcher bis zum ersten 0 die Daten kopiert. Was wenn da kein 0 kommt? Was wenn beim empfangen der Daten ein 0 drin vorkommt?
    ➡ Benutze den Ctor welcher auch noch die Anzahl der zu kopierenden Zeichen als Argument erwartet.



  • Läuft jetzt.In meiner Klasse die das Htttp auswertet hatte ich eine Methode die mir zurückliefert ob es komplett einglesen ist und ich habe vergessen diese in der Schleife zum Einlesen auszuwerten.


Anmelden zum Antworten