2011年1月 8日

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

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月 8日 10:31
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/101177
トラックバック
コメント
コメントする




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