У меня есть машина 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 ведет себя так жеспособ