bernddasbrot2
Goto Top

Bild von HTTP-Server laden

Morgen, alle zusammen,

ich habe mir ein kleines Programm geschrieben, das Bilder von einem HTTP-Server runterlädt. Es funktioniert auch so weit ganz gut. Aber bei manchen Bildern funktioniert es eben gar nicht. Ich habe vielleicht einen kleinen Streifen am oberen Ende des Bildes, aber der Rest ist einfach grau. Im Header steht auch nichts, dass das Bild gechunked wäre. (Ich hoffe, dass ich das richtig verstanden habe, und chunked demnach heissen würde, dass das Bild auf mehrere Pakete verschickt wird).

Also wo ist das Problem. Warum funktionieren manche Bilder, und andere wieder nicht. An der Größe kann es auch nicht liegen. Ich lese die Größe des Bilder vorher aus dem Header, den ich mit einer HEAD-Anfrage bekomme aus, erstelle den Puffer groß genug, und stelle dann die GET-Anfrage.

Könnt ihr mir helfen?

Danke schon mal,
Bernd das Brot

Content-Key: 128422

Url: https://administrator.de/contentid/128422

Printed on: April 19, 2024 at 03:04 o'clock

Member: Tommy70
Tommy70 Nov 02, 2009 at 08:36:51 (UTC)
Goto Top
Hallo

Ein Programmierfehler vielleicht? Ist schwer das genau zu sagen ohne dass man genauere Angaben hat.
Member: H41mSh1C0R
H41mSh1C0R Nov 02, 2009 at 09:28:09 (UTC)
Goto Top
genau, *glaskugel polier*

@bernd das Brot

welche sprache?
Sourcenausschnitt der betreffenden Stelle?

Betrifft das alle Bilder eines Formates?
Wenn ja welches Format?
Tritt dieser Fehler bei mehreren Formaten auf oder nur bei einem bestimmten?
Member: BernddasBrot2
BernddasBrot2 Nov 02, 2009 at 14:39:05 (UTC)
Goto Top
Also es liegt nicht am Format, ich habe bis jetzt nur .jpeg-Bilder geladen.
Ich habe das Programm in C geschrieben.

Der Codeausschnitt:

#pragma comment(lib, "ws2_32.lib") 
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

int WSAStartUp();
main()
{
    long rc;
    int i = 0;
    SOCKET s;
    char *buf, *p_body;
    char anfrage = "GET ADDRESSE_DES_BILDES HTTP/1.1\r\nHost: HOST\r\n\r\n";  
    SOCKADDR_IN addr;
    FILE *file;

    rc = WSAStartUp();
    buf = (char*) malloc(6000000*sizeof(char));

    if(rc!=0)
    {
        printf("Fehler: WSAStartUp()\n");  
        return -1;
    }

    s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    memset(&addr, 0, sizeof(SOCKADDR));
    addr.sin_port = htons(80);
    addr.sin_addr.s_addr = inet_addr("[IP-ADDRESSE]");  
    addr.sin_family = AF_INET;

    rc = connect(s, &addr, sizeof(SOCKADDR));
    if(rc!=0)
    {
        printf("Fehler: connect()\n");  
        return -1;
    }

    rc = send(s, anfrage, strlen(anfrage), 0);
    rc = recv(s, buf, 6000000*sizeof(char), 0);

    while(buf[i] != 13 && buf[i+1] != 10 || buf[i+2] != 13 && buf[i+3] != 10)
    {
        i++;
    }
    p_body = &buf[i+4];
    file = fopen("NAME.jpeg", "wb");  
    fwrite(p_body, 1, rc - i, file);
    fclose(file);
    printf("%s\n", buf);  

    
    closesocket(s);

    _getche();

}

int WSAStartUp()
{
    WSADATA wsa;
    return WSAStartup(MAKEWORD(2,0), &wsa);
}

Wie gesagt, bei den meisten Bildern funktioniert es, aber es gibt doch auch einige, die nicht so funktionieren.