Pregunta Comprender IO.select when reading socket in Ruby


Tengo un código que estoy usando para obtener datos de un socket de red. Funciona bien, pero me abrí camino a través de ensayo y error. Humildemente confieso que no entiendo completamente cómo funciona, pero realmente me gustaría. (Esta fue la carga culpó el código de trabajo que encontré)

La parte que no entiendo comienza con "ready = IO.select ..." No estoy seguro de:

  1. Lo que IO.select está haciendo (intenté buscarlo pero me confundí aún más con Kernel y lo que no)
  2. lo que el argumento de matriz para IO.select es para
  3. qué listo [0] está haciendo
  4. la idea general de leer 1024 bytes? a la vez

Aquí está el código:

@mysocket = TCPSocket.new('192.168.1.1', 9761)

th = Thread.new do
    while true
        ready = IO.select([@mysocket])
        readable = ready[0]

        readable.each do |socket|
            if socket == @mysocket
                buf = @mysocket.recv_nonblock(1024)
                if buf.length == 0
                    puts "The server connection is dead. Exiting."
                    exit
                else
                    puts "Received a message"
                end
            end
        end

    end
end

Gracias de antemano por ayudarme a "aprender a pescar". Odio tener partes de mi código que no entiendo completamente, solo funciona por coincidencia.


13
2018-05-29 03:14


origen


Respuestas:


1) IO.select toma un conjunto de sockets y espera hasta que sea posible leer o escribir con ellos (o si ocurre un error). Devuelve el evento de sockets que sucedió con.

2) el conjunto contiene conectores que se verifican para eventos. En su caso, solo especifica tomas para leer.

3) IO.select devuelve una matriz de matrices de sockets. El elemento 0 contiene conectores de los que puede leer, elemento 1 - conectores en los que puede escribir y elemento 2 - conectores con errores.

Después de obtener la lista de tomas, puede leer los datos.

4) sí, recv_nonblock argumento es el tamaño en byte. Tenga en cuenta que el tamaño de los datos que se leen realmente puede ser inferior a 1024, en este caso es posible que necesite repetir select (si los datos reales son importantes para usted).


18
2018-05-29 03:26