1) IO.select
принимает набор сокетов и ждет, пока можно будет читать или писать с ними (или если произойдет ошибка).Возвращает событие sockets, произошедшее с.
2) массив содержит сокеты, которые проверяются на наличие событий.В вашем случае вы указываете только сокеты для чтения.
3) IO.select
возвращает массив массивов сокетов.Элемент 0 содержит сокеты, из которых вы можете читать, элемент 1 - сокеты, в которые вы можете писать, и элемент 2 - сокеты с ошибками.
После получения списка сокетов вы можете прочитать данные.
4)да, recv_nonblock
аргумент - это размер в байтах.Обратите внимание, что размер фактически читаемых данных может быть меньше 1024, в этом случае вам может потребоваться повторить select
(если для вас важны фактические данные).