症状
Mozilla Firefox と Google Chrome の両方が同じエラーを生成するため、何かを台無しにしたと思います。Web サーバーが送信する応答全体を受信していません。CURL は見逃すことはありません。クイック スクロール応答の最後の行は常に"</html>"です。
理由
その理由は、多くの部分で応答を送信するためです。
sendHeaders(); // is calls sendResponse with a fix header
sendResponse(html_opening_part);
for ( ...scan some data... ) {
sendResponse(the_data);
} // for
sendResponse(html_closing_part)
ブラウザーはsendResponse()呼び出しの間にデータの受信を停止します。また、Web サーバーは最後にソケットをclose()しません。
(なぜ私がこのようにしているのか: 私が書いたプログラムは Linux 以外のシステム用に設計されており、組み込みコンピューターで実行されます。メモリはそれほど多くなく、ほとんどがlwIPスタックによって占められています。比較的 - 巨大なウェブページなので、分割して送信します。ブラウザはそれを好み、Linux のように HTML が壊れることはありませんでした。)
環境
プラットフォームは GNU/Linux (3.0 カーネルの Ubuntu 32 ビット) です。私の小さなWebサーバーは、クライアントの標準的な方法に物を送り返します:
int sendResponse(char* data,int length) {
int x = send(fd,data,length,MSG_NOSIGNAL);
if (x == -1) {
perror("this message never printed, so there's no error \n");
if (errno == EPIPE) return 0;
if (errno == ECONNRESET) return 0;
... panic() ... (never happened) ...
} // if send()
} // sendResponse()
そして、ここに私が使用している固定ヘッダーがあります:
sendResponse(
"HTTP/1.0 200 OK\n"
"Server: MyTinyWebServer\n"
"Content-Type: text/html; charset=UTF-8\n"
"Cache-Control: no-store, no-cache\n"
"Pragma: no-cache\n"
"Connection: close\n"
"\n"
);
質問
これは正常ですか?単一のsend()で応答全体を送信する必要がありますか? (迅速な解決策が見つかるまで、私は現在取り組んでいます。)