come inviare un'immagine in Winsock2, utilizzando c
-
25-10-2019 - |
Domanda
Sto scrivendo un semplice server web in c (Winsock2).
Sono in grado di restituire il contenuto delle mie pagine HTML.
Al momento, quello che sto facendo è la scrittura il contenuto di un file in un char * buffer e inviarlo utilizzando "send ()"
Anche se quando provo a leggere un'immagine (jpg, bmp), non riesco a scrivere i caratteri in un buffer un alcuni caratteri sono "null" (0).
Come posso inviare un file di immagine intera?
Grazie.
Soluzione
È possibile memorizzare carattere null in un buffer char*
. È solo usare un contatore per ricordare quanti caratteri sono stati scritti, invece di ricalcolare dal numero di conteggio di caratteri non nulli (questo può essere sia un numero intero o un puntatore al successivo punto di inserimento nel buffer).
Per inviare un file, è fare qualcosa di simile:
int sendFile(int sock, const char* filename) {
FILE* file = fopen(filename, "rb");
if (file == NULL)
return -1;
if (fseek(file, 0, SEEK_END) != 0) {
fclose(file);
return -1;
}
off_t size = ftello(file);
if (fseek(file, 0, SEEK_SET) != 0) {
fclose(file);
return -1;
}
if (SendBinaryFileHeaderAndSize(sock, size) < 0) {
fclose(file);
return -1;
}
char buffer[4096];
for (;;) {
size_t read = fread(buffer, 1, sizeof(buffer), file);
if (read == 0) {
int retcode = 0;
if (ferror(file))
retcode = -1;
fclose(file);
return retcode;
}
for (size_t sent = 0; sent < read;) {
int ret = send(sock, buffer + sent, read - sent, 0);
if (ret < 0) {
fclose(file);
return -1;
}
assert(ret <= read - sent);
sent += ret;
}
}
}
Altri suggerimenti
È necessario capire come send () e fread) lavoro (. 0s nel buffer non sono un problema per l'invio o fread - non interpretano i loro buffer come stringhe null-terminate
.A seconda di come si carica l'immagine nel server web, si avrebbe bisogno di utilizzare Winsock: TransmitPackets o Winsock: TransmitFile , anche anche avvolgendo l'immagine nella appropriata intestazioni HTTP
Si noti che questi sono estensioni specifiche MS.
Si veda anche C ++ - trasferimento Bitmap utilizzando Winsock GetDIBits e SetDIBits