0

今のところ、接続を介してHTMLコンテンツを作成することに問題はありません。

    sprintf(toreturn, "%s\r\n%s\r\n%s\r\n\r\n%s", "HTTP/1.1 200 OK", "Content-Type: text/html", "Connection: close",htmlstring);
    write(*inputfd, toreturn, strlen(toreturn))

これは問題なく動作します。しかし、これは私が画像リクエストに応答して画像を渡そうとしているものです。この場合は.icoファイル用ですが、私の問題は任意のバイナリファイルに当てはまります。

    FILE *writefile = (FILE *)calloc(1,sizeof(FILE));
    char *charptr = inputaddress;
    charptr++;
    writefile=fopen(charptr,"r");

    sprintf(toreturn, "%s\r\n%s\r\n%s\r\n\r\n", "HTTP/1.1 200 OK", "Content-Type: image/vnd.microsoft.icon", "Connection: close");
    write(*inputfd, toreturn, strlen(toreturn))
    write(*inputfd, *writefile, strlen(toreturn)
    close(*inputfd);
    fclose (writefile);

これは機能しません。write()CでHTTPを介して画像(または任意のバイナリファイル)ファイルを使用するにはどうすればよいですか?

4

3 に答える 3

3

2つの問題:

  1. HTTPヘッダーにコンテンツ長ヘッダーを出力する必要があります。

  2. Writefileは画像のデータではありません。コードが行うことは、ファイル記述子の内容をクライアントに出力することです。

正しいシーケンスは次のようになります

  1. アイコンファイルを開きます。
  2. アイコンファイルの長さを照会する
  3. 現在と同じ方法でHTTPヘッダーを作成しますが、Content-Lengthヘッダーも含めます。
  4. ファイルの内容をバッファに読み込みます
  5. 内容を出力ソケットに出力します。

大きなファイルの場合、ステップ4と5をループに書き込む必要があります。そうしないと、メモリが無駄になります。

于 2013-02-07T17:02:00.163 に答える
3

バイナリデータを操作する場合、C文字列関数を使用することはできません。C文字列は0バイトで終了するためstrlen()、バイナリデータを含む可能性のある文字列で使用すると、切り捨てられた結果が返されます。

'*'さらに、演算子を使用してファイルの内容を取得することはできません。FILE*また、関数(fopen / fclose / fread / fwrite)を通常の関数(open / close / read / write)と混在させないでください。通常、使用sprintf()すると問題が発生します。これをより安全に置き換えることができsnprintf()ます。

それを機能させるために何をしなければならないかについてopen()は、読み取り用のアイコンを表示してから、read()関数を使用して、0未満の値が返されるまでループ内のバッファーのデータを取得する必要があります。その例が見つかる可能性がありますここ:http ://www.java-samples.com/showtutorial.php?tutorialid = 569

于 2013-02-07T17:00:46.053 に答える
0

では、このコードは何をするのだと思いますか?

writefile=fopen(charptr,"r");
...
write(*inputfd, *writefile, strlen(toreturn)

writefile「参照するファイルの内容を書く」と言ったら、あなたはinputfd間違っているでしょう。

write書き込みたい実際のデータを含むバッファを取り、書き込むバイト数を指定する必要があります。あなたはそれに(関数が期待または必要とするものではない)を渡し、ヘッダーと同じ数のバイトを書き込むように要求しています。FILE

率直に言って、これがコンパイルされても驚いています...

必要なファイルを開き、サイズを確認し、適切なサイズのバッファを割り当て、そのバッファに内容を読み込み、ファイルを閉じてから、バッファ全体をクライアントに送信してみてください。

于 2013-02-07T16:55:17.313 に答える