RubyのTCPSocketで利用可能なデータのバイト数を調べる方法はありますか? つまり、ブロックせずに準備できるバイト数は?
2453 次
1 に答える
7
ここでは、標準ライブラリio/wait
が役立つ場合があります。それを要求すると、ストリームベースのI / O(ソケットとパイプ)にいくつかの新しいメソッドが提供されready?
ます。ドキュメントによると、準備はいいですか?ブロックせずに使用可能なバイトがある場合は、nil以外を返します。nil以外の値は、MRIで使用可能なバイト数を返します。
これは、ばかげた小さなソケットサーバーを作成し、クライアントでそれに接続する例です。サーバーは「foo」を送信してから接続を閉じます。クライアントは、サーバーに送信する時間を与えるために少し待機してから、読み取りに使用できるバイト数を出力します。あなたにとって興味深いものはクライアントにあります:
require 'socket'
require 'io/wait'
# Server
server_socket = TCPServer.new('localhost', 0)
port = server_socket.addr[1]
Thread.new do
session = server_socket.accept
sleep 0.5
session.puts "foo"
session.close
end
# Client
client_socket = TCPSocket.new('localhost', port)
puts client_socket.ready? # => nil
sleep 1
puts client_socket.ready? # => 4
そのサーバーコードを実際には使用しないでください。例を単純にするために、意図的に遅らせています。
注:Pickaxeの本によると、io / waitは、「ioctl(2)のFIONREAD機能」の場合にのみ使用できます。Linuxではどちらですか。Windowsなどは知りません。
于 2010-10-21T02:23:45.303 に答える