Http - Client



  • Vielleicht öffnest du fileptr im textmode ?
    Kurt



  • 😃
    Hab die Antwort zu spät gelesen
    sebastian



  • FILE *fileptr;

    fileptr = fopen("image.gif","w+");



  • Ich habs! Ich speichere ja noch den http-header mit. Muss noch ein weg finden den wegzukriegen.



  • du schreibst LINELEN bytes, obwohl du nur n bytes schreiben solltest.

    im uebrigen heisst es \r\n\r\n statt \n\r\n\r



  • Danke, hast mich der Lösung näher gebracht. Aber es sind immer noch 200 Bytes zuviel. 😞

    Der HTTP Header wird immer noch mitgespeichert.

    Hier ein Auszug der Datei:

    HTTP/1.0 200 OK^M
    Content-Type: image/gif^M
    Last-Modified: Mon, 25 Apr 2005 21:07:03 GMT^M
    Expires: Sun, 17 Jan 2038 19:14:07 GMT^M
    Server: GWS/2.1^M
    Content-Length: 9121^M
    Date: Sat, 03 Dec 2005 23:28:06 GMT^M
    Connection: Keep-Alive^M
    ^M
    GIF89a-^An^@ç^@^@ÿÿÿ÷...................Dateikauderwelsch
    

    Hab schon alles mögliche probiert,weiss aber nicht wie ich den wegbekomme.
    Sebastian



  • der header hoert nach dem ersten \r\n\r\n auf. nach der markierung suchst du und speicherst nur den rest.



  • Welche Fkt. würdest du nutzen um dieses \r\n\r\n zu finden?

    Habs mit memmem versucht, hat aber nicht geklappt. 😞

    while( (n = read(s, buf, LINELEN)) > 0)
      {
      	if(found = 0)
    	{
      		tmp = (char *)memmem(buf,sizeof(buf),"\r\n\r\n",4);
    		if(tmp != NULL)
    		{
    			fwrite(tmp,1,n,fileptr);
    			found =1;
    		}
    	}
    	else
    				fwrite(tmp,1,n,fileptr);
      }
    


  • > Welche Fkt. würdest du nutzen um dieses \r\n\r\n zu finden?
    dein memmem() find ich ausgezeichnet geeignet. kannte die funktion vorher noch garnicht.

    > ...hat aber nicht geklappt.
    inwiefern?

    in deinem code wuerde ich es so machen:

    fwrite(tmp+4, 1, n - (4 + (int)(tmp-buf)), fileptr);
    

    +4 fuer \r\n\r\n
    und "n-..." als korrektur fuer die laenge.

    soll das if (found=0) beabsichtigt eine zuweisung sein?



  • Hab keine Ahunng ob hinter dem File noch etwas gesendet wird aber im Header steht ja das Feld Content-Length also vielleicht geht
    Anfang = GesammtLänge - ContentLength ( ok das funktioniert nur wenn du das komplette File in den Speicher liest ).
    Ausserdem ist der Header ist ja sowieso Text also müsste strstr() auch funktionieren.
    Kurt



  • Aber es ist nicht sichergestellt das das \r\n\r\n an einem Stück kommt.



  • Hab versucht die Datei komplett in den Speicher zu laden. Die Datei ist aber nicht in Ornung.
    Hier ein Auszug:

    !áʯ^T˱$˲?¯°^LK³T˵^L?~@^@^@^@^@^@^@^@^@^@^@^@^@^..............
    

    Vermute das es am strcat liegt, weiss aber kein anderen weg buf an den bisher eingelesenen Speicher(tmp) anzuhängen. Hab strncpy schon mit memcpy ersetzt, daran liegt es nicht, das die Datei so ausschaut.

    int cnt = 0;
      while( (n = read(s, buf, LINELEN)) > 0)
      {
    	    if (!tmp){
    		    tmp = (char*) malloc(n);
    		} else {
    		    tmp = (char*) realloc(tmp,cnt+n);
    		}
    	cnt=cnt+n;
    	tmp2=malloc(cnt);
    	strcat(tmp2,buf);
    	strncpy(tmp,tmp2,cnt-1);
      }
    fwrite(tmp,1,cnt,fileptr);
    


  • Wie gesagt stringfunktionen funktionieren definitiv nicht. memcpy funktioniert. Du brauchst aber etwas Zeigerarithmetik.
    Kurt



  • Will mal nicht so sein. Ungefähr so sollte es funktionieren ( ungetestet )

    char * tmp = 0;
      unsigned int sz_read;
      while( (n = read(s, buf, LINELEN)) > 0) {
            if (!tmp){
                tmp = (char*) malloc( sz_read );
                memcpy( tmp, buf, n );
            } else {
                tmp = (char*) realloc( tmp, sz_read );
                memcpy( tmp+sz_read, buf, n );
            }
            sz_read += n;
      }
    

    Kurt



  • Danke für den Tip.

    Hab das sz_read += n; vor dem if verschoben. Die Datei wird heruntergeladen ist aber unvollstandig(etwa 100 Byte) fehlen.
    Der Header schaut etwas komisch aus:

    HTTP/1.0 200 OK^M
    Content-Type: image/gif^M
    Last-Modified: Mon, 25 Apr 2005 21:07:03 GMT^M
    Expires: Sun, 17 Jan 2038 19:14:07 GMT^M
    ^@^@^@^@9?^A^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@Server: GWS/2.1^M
    Content-Length: 9121^M
    Date: Sun, 04 Dec 2005 15:40:51 GMT^M
    Connection: Keep-Alive^M
    ^M
    

    Wo kommen die ganzen @@^@ her?



  • Kleiner fehler im code ( wollte dich testen 😉 )

    char * tmp = 0;
      unsigned int sz_read = 0;
      while( (n = read(s, buf, LINELEN)) > 0) {
            if (!tmp){
                tmp = (char*) malloc( n );
                memcpy( tmp, buf, n );
            } else {
                tmp = (char*) realloc( tmp, sz_read );
                memcpy( tmp+sz_read, buf, n );
            }
            sz_read += n;
      }
    

    Kurt



  • Endlich klappt es!!!

    Danke an alle für die guten Tips, vor allem Kurt. 🙂


Anmelden zum Antworten