5

RubyのTCPSocketで利用可能なデータのバイト数を調べる方法はありますか? つまり、ブロックせずに準備できるバイト数は?

4

1 に答える 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 に答える