首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ruby http-2实现: eof是如何工作的?

Ruby http-2实现: eof是如何工作的?
EN

Stack Overflow用户
提问于 2016-11-24 22:15:30
回答 1查看 124关注 0票数 2

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

代码语言:javascript
复制
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,但我不明白是怎么回事。服务器不会知道哪一个流是最后一个流。

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

EN

回答 1

Stack Overflow用户

发布于 2016-12-03 03:08:38

这取决于它是否是安全连接。如果它是而不是安全连接,那么sock就是TCPSocket实例。

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

TCPSocket < IPSocket < BasicSocket < IO

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

如果套接字关闭或存在错误,则套接字可能处于类似eof的状态。也就是说,没有更多的数据可读。来自Ruby docs

如果ios位于文件末尾,则

#eof?返回true,这意味着没有更多数据可读。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40788646

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档