私はc(winsock2)で非常に単純なWebサーバーを書いています。
HTMLページのコンテンツを返すことができます。
現在、私が行っているのは、ファイルの内容をchar *バッファーに書き込み、「send()」を使用して送信することです。
画像(jpg、bmp)を読み込もうとすると、バッファに文字を書き込めませんが、一部の文字は「null」(0)です。
画像ファイル全体を送信するにはどうすればよいですか?
ありがとう。
私はc(winsock2)で非常に単純なWebサーバーを書いています。
HTMLページのコンテンツを返すことができます。
現在、私が行っているのは、ファイルの内容をchar *バッファーに書き込み、「send()」を使用して送信することです。
画像(jpg、bmp)を読み込もうとすると、バッファに文字を書き込めませんが、一部の文字は「null」(0)です。
画像ファイル全体を送信するにはどうすればよいですか?
ありがとう。
ヌル文字をchar*
バッファに格納できます。ヌル以外の文字の数をカウントして再計算するのではなく、カウンターを使用して書き込まれた文字数を記憶する必要があります(これは整数またはバッファー内の次の挿入ポイントへのポインターのいずれかです)。
ファイルを送信するには、次のようにします。
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;
}
}
}
send()とfread()がどのように機能するかを理解する必要があります。バッファ内の0は、sendまたはfreadの問題ではありません。これらは、バッファをnullで終了する文字列として解釈しません。
画像をウェブサーバーに読み込む方法に応じて、 Winsock:TransmitPacketsまたはWinsock: TransmitFileのいずれかを使用する必要があります。また、画像を適切なHTTPヘッダーでラップする必要があります。
これらはMS固有の拡張機能であることに注意してください。