如何检测插座是否半开?我正在处理的情况是当套接字的另一端发送了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会话。此时,它会尽可能快地一遍又一遍地打印空字符串。
答案 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#read
和 IO#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