在Ruby中读取套接字时了解IO.select

我有一些代码,我用来从网络套接字获取数据。 它工作正常,但我试图通过反复试验进入它。 我谦卑地承认我不完全理解它是如何工作的,但我真的很想。 (这是我找到的货物forms的工作代码)

我不明白的部分以“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) IO.select接受一组套接字并等待,直到可以读取或写入它们(或者如果发生错误)。 它返回发生的套接字事件。

2)数组包含检查事件的套接字。 在您的情况下,您只指定用于阅读的套接字。

3) IO.select返回一组套接字数组。 元素0包含可以读取的套接字,元素1 – 可以写入的套接字和元素2 – 有错误的套接字。

获取套接字列表后,您可以读取数据。

4)是的, recv_nonblock参数是以字节为单位的大小。 请注意,实际读取的数据大小可能小于1024,在这种情况下,您可能需要重复select (如果实际数据对您很重要)。