田中さん

魏です。

遅れました。
私のほうでも確認しました。
やっぱりECONNRESETになってしまいます。

原因が分かって良かったです。
ありがとうございます。

2011年1月8日10:31 Tanaka Akira <akr / fsij.org>:
> 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]
>
>