0

私はc(winsock2)で非常に単純なWebサーバーを書いています。

HTMLページのコンテンツを返すことができます。

現在、私が行っているのは、ファイルの内容をchar *バッファーに書き込み、「send()」を使用して送信することです。

画像(jpg、bmp)を読み込もうとすると、バッファに文字を書き込めませんが、一部の文字は「null」(0)です。

画像ファイル全体を送信するにはどうすればよいですか?

ありがとう。

4

3 に答える 3

1

ヌル文字を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;
        }
    }
}
于 2011-03-16T15:29:04.233 に答える
1

send()とfread()がどのように機能するかを理解する必要があります。バッファ内の0は、sendまたはfreadの問題ではありません。これらは、バッファをnullで終了する文字列として解釈しません。

于 2011-03-16T15:30:15.107 に答える
0

画像をウェブサーバーに読み込む方法に応じて、 Winsock:TransmitPacketsまたはWinsock: TransmitFileのいずれかを使用する必要があります。また、画像を適切なHTTPヘッダーでラップする必要があります。

これらはMS固有の拡張機能であることに注意してください。

c++も参照してください-winsockgetdibitsおよびsetdibitsを使用したビットマップ転送

于 2011-03-16T15:07:36.520 に答える