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)
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";
warum die memove von 'send_buffer' zu' send_buffer'? Das sollte genau nichts tun. –
offensichtlich, es wäre notwendig zu zeigen, wo Sie Ihre Header senden/erstellen. –
@ 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