Понимание IO.select при чтении сокета в Ruby - PullRequest
16 голосов
/ 29 мая 2011

У меня есть код, который я использую для получения данных из сетевого сокета. Это работает нормально, но я пробил себе путь проб и ошибок. Я смиренно признаю, что не до конца понимаю, как это работает, но мне бы очень хотелось. (Это был рабочий код, который я нашел)

Часть, которую я не понимаю, начинается с "ready = IO.select ..." Мне неясно:

  1. Что делает IO.select (я пытался найти его, но еще больше запутался с ядром и чем-то еще)
  2. что аргумент массива для IO.select для
  3. что готово [0] делает
  4. общая идея чтения 1024 байта? за один раз

Вот код:

@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

Заранее спасибо, что помогли мне "научиться ловить рыбу". Я ненавижу иметь кусочки своего кода, которые я не до конца понимаю - он просто работает по стечению обстоятельств.

1 Ответ

21 голосов
/ 29 мая 2011

1) IO.select принимает набор сокетов и ждет, пока можно будет читать или писать с ними (или если произойдет ошибка).Возвращает событие sockets, произошедшее с.

2) массив содержит сокеты, которые проверяются на наличие событий.В вашем случае вы указываете только сокеты для чтения.

3) IO.select возвращает массив массивов сокетов.Элемент 0 содержит сокеты, из которых вы можете читать, элемент 1 - сокеты, в которые вы можете писать, и элемент 2 - сокеты с ошибками.

После получения списка сокетов вы можете прочитать данные.

4)да, recv_nonblock аргумент - это размер в байтах.Обратите внимание, что размер фактически читаемых данных может быть меньше 1024, в этом случае вам может потребоваться повторить select (если для вас важны фактические данные).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...