2011年1月11日

[ruby-list:47750] Re: TCPServerクラスではacceptしたオブジェクトに対してgetsする必要はあるか?

田中さん

魏です。

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

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

2011年1月8日10:31 Tanaka Akira <akr@xxxxx>:
> 2011年1月7日22:16 Wei Yuan <weiy1005@xxxxx>:
>
>> 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]
>
>


投稿者 xml-rpc : 2011年1月11日 22:20
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/101217
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。