ruby - 为什么 Ruby 的 select 不返回套接字?

标签 ruby select sockets

我尝试在 STDIN 上使用 select 并在 Ruby 中使用 TCP 套接字,但出于某种原因,从 select 返回的值似乎与其中一个选项不匹配;它看起来像是被返回的套接字,但它不匹配使用 ==(或等于?)。谁能告诉我为什么从 select 返回的结果与我传入的对象不匹配,以及我应该在这里做些什么不同的事情?

server = TCPSocket::new("irc.freenode.net", 7000)
server.puts "NICK MyBot"
server.puts "USER #{ENV['USER']} 0 * :My Bot"

# <snip definitions>

while (!$done)
  results = select([server, STDIN], nil, nil)
  if results[0] == STDIN
    puts "Reading from STDIN"
    execute_command
  elsif results[0] == server
    puts "Reading from server"
    receive_data
  else
    puts "Something's wrong... results[0]: #{results[0]}, server: #{server}"
    puts "IDs: results[0]: #{results[0].__id__}, server: #{server.__id__}"
    exit 1
  end
end

这是我运行时得到的结果:

Something's wrong... results[0]: #<TCPSocket:0x33c390>, server: #<TCPSocket:0x33c390>
IDs: results[0]: 1695840, server: 1695990

我在 Mac OS X 上运行 Ruby 版本 1.8.6。

$ ruby --version
ruby 1.8.6 (2008-03-03 patchlevel 114) [universal-darwin9.0]
$ which ruby
/usr/bin/ruby

最佳答案

select 返回的 Array 的第一个元素是准备好的 IO 对象的 Array。因此,您应该将 STDIN 和服务器与结果 [0][0] 进行比较。或者更好地检查,如果套接字在结果数组中

...
if results[0].include? STDIN
  ...
elsif results[0].include? server 
 ...
...

关于ruby - 为什么 Ruby 的 select 不返回套接字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/576628/

相关文章:

php - MySQL UNION 不返回任何结果

python - 如何在C(服务器)中收到来自python(客户端)的 "unpack"数据包?

ruby - 如何使用多态性删除比较字符串的 switch 语句?

ruby-on-rails - 通过 Heroku 上的 ruby​​ 守护进程 worker 拒绝 Redis 连接

javascript - 与 ng-model 和 ng-options 绑定(bind)时选择不选择

MYSQL 解释给出 "Impossible WHERE"和 SELECT Count(x) 查询

sockets - lua脚本-套接字连接断开时的结束循环

c++ - 发送和接收 int C++

ruby-on-rails - 在 rails、facebook connect、facebooker 插件中销毁 cookie

ruby-on-rails - Rails action Mailer raise_delivery_errors,它是如何工作的?如何检测反弹?