Вопрос

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

Это было полезно?

Решение

Стандартная библиотека io/wait может быть полезен здесь. Защита от него дает вводе/вывода на основе потока некоторые новые методы, среди которых есть ready?. Анкет Согласно документация, готов? Возвращает не-ноль, если есть байты, доступные без блокировки. Так получилось, что не-ноль значение возвращает ему количество байтов, которые доступны в МРТ.

Вот пример, который создает тупой маленький сервер сокетов, а затем подключается к нему с клиентом. Сервер просто отправляет «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 доступен только в том случае, если «Fionread Feature в ioctl (2)». Который это в Linux. Я не знаю о Windows и других.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top