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

Ale*_*lex 11 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
Run Code Online (Sandbox Code Playgroud)

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

Rum*_*eed 2

您正在使用阻塞调用recv,当另一端关闭时它将返回nil。在您关闭套接字之前,它不会被关闭。改变

  until c.closed?
    p c.recv(1024)
  end
Run Code Online (Sandbox Code Playgroud)

while (s = c.recv(1024)) && s > 0
   p s
end
c.close
Run Code Online (Sandbox Code Playgroud)