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