gpt4 book ai didi

ruby - 在 Ruby 中读取套接字时理解 IO.select

转载 作者:数据小太阳 更新时间:2023-10-29 06:33:25 26 4
gpt4 key购买 nike

我有一些代码用于从网络套接字获取数据。它工作正常,但我通过反复试验失败了。我谦虚地承认我并不完全了解它是如何工作的,但我真的很想了解。 (这是我发现的 cargo 崇拜形式的工作代码)

我不明白的部分以“ready = IO.select ...”开头,我不清楚:

  1. IO.select 正在做什么(我尝试查找它,但对 Kernel 和其他东西更加困惑)
  2. IO.select 的数组参数是做什么用的
  3. ready[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(如果实际数据对您很重要)。

关于ruby - 在 Ruby 中读取套接字时理解 IO.select,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6165735/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com