2016-11-20 2 views
-2

Ich versuche, eine dauerhafte Verbindung vom Browser mit einem einfachen HTTP-Server in reinem C.Senden Bild über Linux C TCP

Die Antwort auf jeden HTML/Text ist gut geschrieben zu halten, aber ich habe Probleme beim Senden Bilddateien. Ich habe festgestellt, dass ein Header (nämlich wegen) obligatorisch ist, wenn ein Browser eine Verbindung herstellt. Daher sende ich zuerst den Header und dann das Bild. Der Server-Code ist wie folgt:

// section relating to responding an image 
else if(!strncmp(buf, "GET /testpic.jpg", 16)) { 
    FILE * _fdimg = fopen("testpic.jpg", "rb"); 
    struct stat st; 
    stat("testpic.jpg", &st); 

    char send_buffer[100000]; 

    int read_size = fread(send_buffer, 1, st.st_size , _fdimg); 
    // regradless of the third param, the read_size value is 50029 which is the correct size of the image 


    // header_image is a char[] corresponding to appropriate headers with correct content-length 

    write(socket, header_img, sizeof(header_img)); 
    write(socket, send_buffer, st.st_size); 

    // This works, but I can't send the header with this function. 
    // sendfile(socket, _fdimg, NULL, 600000); 
} 

Nun wird der Browser die ständige Verbindung verstehen, wird die richtige Menge an Daten aus dem Sockel holen, aber die Datei über den Sockel hat ein kleines Problem dorthin geschickt, ist eine extra 00 zu Beginn der es (in hex-Format)

enter image description here

Irgendwelche Vorschläge?

Hinweis: Ich habe auch versucht, mit sendfile() Systemcall den Header mit normalen write() und das Bild zu senden, aber der Browser diese nicht richtig erkennen und die Spinner in der Seite wird

Hinweis halten Laden: Die Bildgröße beträgt 50028 Bytes. Die Werte st.st_size und read_size sind korrekt und entsprechen der tatsächlichen Dateigröße. Ich nehme an, dass der Prozess des Lesens aus der Datei in Ordnung ist, aber es gibt einen Index-Mismatch oder irgendeine Art von Fehler, wenn ich es in den Puffer kopieren.

aktualisieren Headers:

char header_img[]= 
"HTTP/1.1 200 OK\r\n" 
"Connection: keep-alive\r\n" 
"Content-Type:image/jpg\r\n" 
"Content-Length: 50029\r\n\r\n"; 
+0

warum die memove von 'send_buffer' zu' send_buffer'? Das sollte genau nichts tun. –

+0

offensichtlich, es wäre notwendig zu zeigen, wo Sie Ihre Header senden/erstellen. –

+0

@ MarcusMüller Yup, dass "memmove" -Linie war nur etwas, das ich testen und vergessen habe loszuwerden. Ich werde mit den Header und Browser-Log in einer Sekunde bearbeiten. – KianP

Antwort

2

Sie zeigen nicht, wie Sie Ihre Header erstellen, aber Sie müssen sich der Tatsache bewusst sein, dass in C, Strings sind 0x00 terminierte:

header-field: value\n\0x00 

Du bist wahrscheinlich

header-field: value\nIMAGEDATA 
nicht

Sendenaber

header-field: value\n\0x00IMAGEDATA 

weil Sie die ganze Zeichenfolge gesendet haben, nicht nur die tatsächlichen Nicht-Terminator-Zeichen.

+0

Ich habe den Header-Abschnitt hinzugefügt. Ich denke stark, dass du völlig richtig bist! Wie kann ich das zusätzliche '0x00' verhindern, wenn ich' char [] 'in' write' sende? – KianP

+0

Wie wäre es mit 'write (socket, header_img, sizeof (header_img) -1);'? – KianP

+2

'sizeof (" literal ")' beinhaltet die NUL, ('strlen()' nicht) – wildplasser