如何設置阻塞在Ruby套接字上的操作的超時時間?如何在Ruby中設置套接字超時?
19
A
回答
17
我找到了解決這似乎工作就是用Timeout::timeout:
require 'timeout'
...
begin
timeout(5) do
message, client_address = some_socket.recvfrom(1024)
end
rescue Timeout::Error
puts "Timed out!"
end
15
超時對象是一個很好的解決方案。
這是異步的I/O的示例(非阻斷性的並且是異步發生的,以 應用程序的流程。)
IO.select(read_array
[, write_array
[, error_array
[, timeout]]]) => array or nil
可用於獲得相同的效果。
require 'socket'
strmSock1 = TCPSocket::new("www.dn.se", 80)
strmSock2 = TCPSocket::new("www.svd.se", 80)
# Block until one or more events are received
#result = select([strmSock1, strmSock2, STDIN], nil, nil)
timeout=5
timeout=100
result = select([strmSock1, strmSock2], nil, nil,timeout)
puts result.inspect
if result
for inp in result[0]
if inp == strmSock1 then
# data avail on strmSock1
puts "data avail on strmSock1"
elsif inp == strmSock2 then
# data avail on strmSock2
puts "data avail on strmSock2"
elsif inp == STDIN
# data avail on STDIN
puts "data avail on STDIN"
end
end
end
8
我認爲非阻塞的方法是要走的路。
我試過上面提到的文章,仍然可以讓它掛起。
這篇文章non blocking networking和jonke的方法讓我走上了正確的道路。我的服務器在初始連接時被阻塞,所以我需要它低一點。
插座的RDoc可以提供更多的細節到connect_nonblock
def self.open(host, port, timeout=10)
addr = Socket.getaddrinfo(host, nil)
sock = Socket.new(Socket.const_get(addr[0][0]), Socket::SOCK_STREAM, 0)
begin
sock.connect_nonblock(Socket.pack_sockaddr_in(port, addr[0][3]))
rescue Errno::EINPROGRESS
resp = IO.select([sock],nil, nil, timeout.to_i)
if resp.nil?
raise Errno::ECONNREFUSED
end
begin
sock.connect_nonblock(Socket.pack_sockaddr_in(port, addr[0][3]))
rescue Errno::EISCONN
end
end
sock
end
得到一個很好的測試。啓動一個簡單的套接字服務器,然後做一個ctrl-z來背景它
IO.select期望數據在10秒內進入輸入流。如果情況並非如此,這可能不起作用。
它應該是TCPSocket開放方法的一個很好的替代品。
相關問題
- 1. 如何設置zmq套接字超時
- 2. 通過SO_RCVTIMEO套接字選項在Ruby中設置套接字超時
- 3. 套接字接收設置超時
- 4. 如何在客戶端套接字連接上設置超時?
- 5. 如何在訪問套接字時將fread設置爲超時?
- 6. 套接字recv的設置超時TCP
- 7. 如何在python的套接字recv方法上設置超時?
- 8. 如何設置套接字超時失敗連接
- 9. 如何在node.js中設置套接字連接超時http客戶端
- 10. 如何在boost asio中設置阻塞套接字的超時時間?
- 11. 如何正確使用Ruby套接字的接收超時?
- 12. 在http請求中設置基於套接字的超時
- 13. Perl:在客戶端套接字中設置讀取超時
- 14. 設置超時設置的套接字有時會在閱讀時失速
- 15. 在套接字上設置超時時出現NoSuchElementException
- 16. 使用Mysql設置連接超時Ruby
- 17. 如何在C套接字上設置「connect()」函數的超時時間?
- 18. 如何在Ruby中設置FTP會話閒置超時?
- 19. 是否可以在Twisted上的套接字上設置超時?
- 20. 在netty通道上設置套接字超時
- 21. ReactPHP /套接字服務器 - 設置連接超時
- 22. 設置UDP套接字的recv fcn的超時時間
- 23. 套接字連接超時
- 24. 如何實現套接字超時?
- 25. 如何在ActionScript3套接字連接中設置字符編碼?
- 26. 在SQLAlchemy中避免套接字超時
- 27. 在C++ Linux中的套接字超時
- 28. 使用javax.xml.soap.SOAPConnection設置套接字讀取超時
- 29. PHP設置套接字超時不起作用?
- 30. SSLSocketFactory設置握手超時和套接字屬性
發現比您接受的更好的解決方案:http://stackoverflow.com/a/12111120/216314 – 2012-09-02 21:28:16
http://ruby-doc.org/stdlib/libdoc/timeout/rdoc/Timeout.html – 2015-10-10 00:17:37
[具有排他鎖的超時模塊](http://stackoverflow.com/a/15304835/1301972)。 – 2015-10-10 00:19:27