Ruby Tcpsocket:利用可能なデータの量を調べる
-
09-10-2019 - |
質問
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やその他については知りません。
所属していません StackOverflow