2011年1月7日22:16 Wei Yuan <weiy1005 / gmail.com>:

> getsを使わなくても、responseできると思ったのですが原因がわかりません。
> よろしくお願いします。

ブラウザが出したリクエストが、サーバ側のソケットがクローズした後に
届いているんじゃないですかね。
そうするとエラーがクライアント側に戻って、アプリケーションに渡されていない
データが破棄されることがありえます。

  % strace -e socket,write,read -s50 -o /tmp/z w3m http://localhost:8000/

というようにしてブラウザ (w3m) が呼んだシステムコールを調べると、最後のほうで

  socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) = 4
  write(4, "GET / HTTP/1.0\r\nUser-Agent: w3m/0.5.2\r\nAccept:
text"..., 215) = 215
  read(4, "HTTP/1.1 200/OK\r\nContent-type:text/html\r\n\r\n"..., 8192) = 43
  read(4, 0x8fb4000, 8192)                = -1 ECONNRESET (Connection
reset by peer)

となって、ボディが届く代わりに ECONNRESET になっているのが観察できます。

もし strace (もしくはその類のシステムコールトレーサ) が使える環境なら、
お使いのブラウザで同様なことをすると、同様な症状が確認できるかもしれません。

> (getsを使わない場合でもtelnetで見ると、ちゃんとボディーはクライアントに届いています。)

telnet で、ボディが届く前にリクエストを入力するのは
むずかしいでしょうね。
-- 
[田中 哲][たなか あきら][Tanaka Akira]