Ruby: каждый поток ввода-вывода в аргументе выходного массива заставляет IO.select не ждать. - PullRequest
0 голосов
/ 23 сентября 2018

У меня есть машина Linux (IP: 10.0.0.33), в которой я запускаю netcat в качестве прослушивателя на порту 4444. У меня также есть машина Windows 10, которую я подключаю к машине Linux с классом TCPSocket.

Я написал код, чтобы помочь мне понять, как IO.select работает с объектом сокета и объектами IO STDIN и STDOUT, но я просто не могу понять это.

Вот мой код:

require 'socket'

socket = TCPSocket.open("10.0.0.33", 4444)
while true
    IO.select([socket], nil, nil) #I'm changing the arguments in this line

    puts(1)
    socket.gets.chomp
    puts(2)

    sleep(1)
end

Как я и ожидал, если я выполню приведенный выше код, ничего не произойдет, пока я не отправлю сообщение с компьютера Linux.Когда я это делаю, печатаются 1 и 2, а затем снова ничего не происходит, пока я не отправлю другое сообщение из Linux (как я и ожидал).

Но, если я изменю только строку IO.select на

IO.select(nil, [socket], nil)

1 печатается немедленно, и я не понимаю, почему.

Если я передаю эту строку кому-либо из следующего:

IO.select(nil, [STDIN], nil)

IO.select(nil, [STDOUT], nil)

IO.select([STDOUT], nil, nil)

1 печатаетсянемедленно.

Почему каждый раз, когда я помещаю что-либо в аргумент выходного массива функции IO.select, IO.select не ждет?Я думал, что он должен найти поток ввода-вывода с некоторыми данными, готовыми для отправки, но я ничего не посылаю в этой программе.

Кроме того, почему помещение STDOUT в аргумент входного массива функции IO.select ведет себя так жеспособ

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