Http - Client



  • 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