Ruby:如何检测套接字的一侧何时被关闭

时间:2009-04-30 15:32:40

标签: ruby sockets

如何检测插座是否半开?我正在处理的情况是当套接字的另一端发送了FIN并且Ruby应用已经确认了FIN。有没有办法告诉我套接字是否处于这种状态?

举个例子:

require 'socket'

s = TCPServer.new('0.0.0.0', 5010)

loop do
  c = s.accept

  until c.closed?
    p c.recv(1024)
  end
end

在这种情况下,当我远程登录到端口5010时,我将看到所有输入,直到我关闭telnet会话。此时,它会尽可能快地一遍又一遍地打印空字符串。

2 个答案:

答案 0 :(得分:1)

您正在使用阻止调用recv,当另一端关闭时,它将返回nil。插座不会关闭,直到你关闭它。变化

  until c.closed?
    p c.recv(1024)
  end

while (s = c.recv(1024)) && s > 0
   p s
end
c.close

答案 1 :(得分:0)

您可以结合使用 IO#readIO#eof? 来检查这一点。

require 'socket'

server = TCPServer.new('0.0.0.0', 5010)

loop do
  client = server.accept
  client.read(1024) until client.eof?
  puts 'client closed connection'
  client.close
end