質問

Rubyのtcpsocketで利用可能なデータのバイト数を見つける方法はありますか?つまり、ブロッキングせずにいくつのバイトを準備できますか?

役に立ちましたか?

解決

標準ライブラリ io/wait ここで役立つかもしれません。それを再Quaringで、ストリームベースの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やその他については知りません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top