cを使用して、winsock2で画像を送信する方法
-
25-10-2019 - |
質問
私はC(Winsock2)で非常にシンプルなWebサーバーを書いています。
HTMLページのコンテンツを返すことができます。
現在、私がしていることは、ファイルの内容をChar*バッファーに書き込み、「send()」を使用して送信することです。
画像(JPG、BMP)を読み込もうとすると、文字をバッファーに書き込むことはできません。一部の文字は「null」(0)です。
画像ファイル全体を送信するにはどうすればよいですか?
ありがとう。
解決
null文字をaに保存できます 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は、送信やフリードにとっては問題ではありません - バッファーはヌル終端文字列として解釈しません。
画像をWebサーバーにロードする方法によっては、どちらかを使用する必要があります Winsock:TransmitPackets また Winsock:送信ファイル, 、また、適切なHTTPヘッダーに画像を包みます
これらはMS固有の拡張機能であることに注意してください。
また、参照してください C ++ -WinsockGetDibitsとSetDibitsを使用したビットマップ転送
所属していません StackOverflow