From: Wei Yuan Date: 2011-01-11T22:20:51+09:00 Subject: [ruby-list:47750] Re: TCPServerクラスではacceptしたオブジェクトに対してgetsする必要はあるか? 田中さん 魏です。 遅れました。 私のほうでも確認しました。 やっぱりECONNRESETになってしまいます。 原因が分かって良かったです。 ありがとうございます。 2011年1月8日10:31 Tanaka Akira : > 2011年1月7日22:16 Wei Yuan : > >> 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] > >