Ruby TCPSocket: узнайте, сколько данных доступно - PullRequest
4 голосов
/ 21 октября 2010

Есть ли способ узнать, сколько байтов данных доступно на TCPSocket в Ruby?Т.е. сколько байтов может быть готово без блокировки?

1 Ответ

5 голосов
/ 21 октября 2010

Стандартная библиотека io/wait может быть полезна здесь.Требование к нему дает потоковому вводу / выводу (сокеты и каналы) некоторые новые методы, среди которых ready?.Согласно документации , готово?возвращает не ноль, если есть байты, доступные без блокировки.Так уж получилось, что ненулевое значение возвращает количество доступных байтов в 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 доступна только в том случае, если в FIXREAD имеется функция ioctl (2).Который есть в Linux.Я не знаю о Windows и других.

...