Pregunta

¿Hay una manera de saber cuántos bytes de datos están disponibles en una TCPSocket en Ruby? Es decir. cuántos bytes puede ser preparada sin el bloqueo?

¿Fue útil?

Solución

El io/wait biblioteca estándar podría ser útil aquí. Exigir a que da a base de corriente de I / O (enchufes y tuberías) algunos nuevos métodos, entre los que se ready?. De acuerdo con la documentación , listo? retornos no nula si hay bytes disponibles sin bloquear. Lo que pasa es que el valor no nulo se devuelve el número de bytes que están disponibles en la RM .

Este es un ejemplo que crea un servidor de socket poco tonto, y luego se conecta a él con un cliente. El servidor simplemente envía "foo" y luego cierra la conexión. El cliente espera un poco para dar tiempo al servidor para enviar, y luego imprime cuántos bytes están disponibles para la lectura. El material interesante para usted está en el cliente:

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

No utilice ese código de servidor en algo real. Se retrasó deliberadamente con el fin de mantener el ejemplo sencillo.

Nota: Según el libro piqueta, io / espera sólo está disponible si "característica FIONREAD en ioctl (2)". Que está en Linux. No sé acerca de Windows y otros.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top