質問

私は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を使用したビットマップ転送

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top