ruby TCPSocket : Find out how much data is available

标签 ruby sockets nonblocking tcpsocket

有没有办法找出在 Ruby 中的 TCPSocket 上可用的数据字节数? IE。在不阻塞的情况下可以准备多少字节?

最佳答案

标准库 io/wait 在这里可能会有用。要求它为基于流的 I/O(套接字和管道)提供了一些新方法,其中包括 ready?。根据documentation , 准备好?如果没有阻塞可用的字节,则返回非零。碰巧它返回的非零值是 MRI 中可用的字节数。

这是一个示例,它创建了一个愚蠢的小型套接字服务器,然后使用客户端连接到它。服务器只是发送“foo”然后关闭连接。客户端稍等片刻,让服务器有时间发送,然后打印出有多少字节可供读取。对你来说有趣的东西在客户端:

require 'socket'
require 'io/wait'

# Server

server_socket = TCPServer.new('localhost', 0)
port = server_socket.addr[1]
Thread.new do
  session = server_socket.accept
  sleep 0.5
  session.puts "foo"
  session.close
end

# Client

client_socket = TCPSocket.new('localhost', port)
puts client_socket.ready?    # => nil
sleep 1
puts client_socket.ready?    # => 4

不要在任何真实的地方使用该服务器代码。为了使示例简单,特意简短。

注意:根据 Pickaxe 书,io/wait 仅在“ioctl(2) 中的 FIONREAD 功能”时可用,而它在 Linux 中。我不知道 Windows 和其他系统。

关于 ruby TCPSocket : Find out how much data is available,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3983739/

相关文章:

c++ - Windows套接字编程中主机名的IP地址

c++ - 编写推送到客户端 (TCP) 的服务器应用程序

database - NimbusDB - 分布式、非阻塞、原子提交协议(protocol)?

Ruby 与 block 的混淆

ruby-on-rails - ruby on Rails 中不可编辑的文本字段

ruby-on-rails - Mechanize :未登录本站

C/C++ Posix BSD 套接字 - HTTP 请求始终返回状态 400

c++ - 非阻塞键盘读取 - C/C++

events - Postgres : Post statement (or insert) asynchronous, 非阻塞处理

ruby-on-rails - 每个请求的 Ruby GC 执行超过 ~250-320 毫秒