【问题标题】:Ruby http-2 implementation: how does eof work?Ruby http-2 实现:eof 是如何工作的?
【发布时间】:2017-04-08 21:21:42
【问题描述】:

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

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,但我不明白如何。服务器不会知道哪个流是最后一个。

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

【问题讨论】:

    标签: ruby sockets http2


    【解决方案1】:

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

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

    TCPSocket

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

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

    #eof? 如果 ios 位于文件末尾,则返回 true,这意味着没有更多数据要读取。

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

    【讨论】:

    • 你知道循环通常是如何结束的吗?
    猜你喜欢
    • 2011-05-30
    • 2012-12-31
    • 1970-01-01
    • 1970-01-01
    • 2017-04-06
    • 2020-07-31
    • 1970-01-01
    • 2017-03-18
    • 1970-01-01
    相关资源
    最近更新 更多