0
我有以下连接到HTTP主机的功能。我想正确使用超时。有时似乎工作,但有时不会,只是永远挂起:Ruby'套接字'超时问题
def http_send(host, packet, port, timeout = 6)
addr = Socket.getaddrinfo(host, nil)
sockaddr = Socket.pack_sockaddr_in(port, addr[0][3])
Socket.new(Socket.const_get(addr[0][0]), Socket::SOCK_STREAM, 0).tap do |socket|
socket.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1)
begin
socket.connect_nonblock(sockaddr)
rescue IO::WaitWritable
if IO.select(nil, [socket], nil, timeout)
begin
socket.connect_nonblock(sockaddr)
socket.write(packet)
return socket.read
rescue Errno::EISCONN
rescue
socket.close
puts "[!] Unexpected exception!"
end
else
socket.close
puts "[!] Connection timeout!"
end
end
end
end
任何想法为什么发生这种情况?谢谢!
周围没有红宝石大师? – bsteo
首先我怀疑'IO.select(nil,[socket],nil,timeout)'表达式错过它的'begin..end'异常处理块。其次,我建议尝试在'Timeout :: timeout'块中包含整个代码,以测试它是否在一段时间后正确中止。当然,为了测试目的。 –
好吧,我会尝试 – bsteo