gpt4 book ai didi

Ruby http-2 实现 : how does eof work?

转载 作者:太空宇宙 更新时间:2023-11-03 16:43:03 24 4
gpt4 key购买 nike

example Ruby http-2 gem 的客户端实现在底部有一段代码用于从套接字读取数据:

while !sock.closed? && !sock.eof?
data = sock.read_nonblock(1024)
# puts "Received bytes: #{data.unpack("H*").first}"

begin
conn << data
rescue => e
puts "#{e.class} exception: #{e.message} - closing socket."
e.backtrace.each { |l| puts "\t" + l }
sock.close
end
end

我不明白这个循环是如何终止的。大概是从套接字中获取了一个eof,但我不明白如何。服务器不会知道哪个流是最后一个流。

假设没有错误,这个循环是如何结束的?

最佳答案

这取决于它是否是安全连接。如果它不是安全连接,则 sock 是 TCPSocket 的一个实例。

#eof? 方法是在 IO 类上定义的。层次结构是:

TCPSocket < IPSocket < BasicSocket < IO

IO 是套接字类和 File 类的祖先类。它具有通用的 IO 方法,我认为这些方法在具体实现上的工作方式不同。

如果套接字关闭或出现错误,则套接字可能处于eof-like 状态。也就是说,没有更多的数据可以读取了。来自 Ruby docs :

#eof? Returns true if ios is at end of file that means there are no more data to read.

我不知道套接字在什么情况下会 eof 而不会关闭,但这是一个更高层次的解释。您可以深入了解 eof? 实现以查看更多详细信息,以及一般的套接字。根据我的经验,像 TCPSocket 这样的类是系统实现的包装器。

关于Ruby http-2 实现 : how does eof work?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40788646/

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