2012-10-04 38 views
3

我正在寫一個將打開tcp套接字和流數據的Ruby客戶端。Ruby套接字編程中的標準套接字超時(秒)是多少?

如果我無法在20秒內打開套接字,我將觸發超時錯誤。

begin 
    Timeout::timeout(20) { socket = open_socket(host, port) } 
rescue Errno::ECONNREFUSED 
    puts "Failed to connect to server" 
rescue Timeout::Error 
    puts "Timeout error occurred while connecting to the server" 
end 

我的open_socket方法如下。

def open_socket(host,port) 
    TCPSocket.new(host,port) 
end 

代碼正常工作。我的問題是

  1. 什麼是套接字編程秒標準超時時間?
  2. 是否可以根據我們的需要設置超時秒數?

回答

0

我發現2篇文章,似乎確認超時爲20秒:

第二條似乎意味着超時時間由OS定義。

我沒有第二個問題的答案。

0

這正是你如何做的。超時的默認值是10秒。

超時(秒){...}

執行塊,並且如果所述塊執行終止成功之前的超時週期的流逝返回true, 否則立即終止該塊的執行並引發一個例外TimeoutError 。

require 'timeout' 
status = timeout(5) { 
# something that may take time 
} 
+5

這是特定於ruby的實現(我非常肯定它可能不適用於Jruby/rubinius)。而且,使用Timeout.timeout通常是一個糟糕的主意。性能:Timeout.timeout通過產生線程(代價高昂)工作。功能:Timeout.timeout取決於可中斷的阻塞呼叫。脆弱性:它通過在區塊中引發異常而發揮作用,這可以發生在任何地方。例如,它可能會在插槽建成後立即引發,這會導致泄漏(只有在GC啓動時插槽纔會關閉) –

+0

是的,sylvain.joyeux您給出了正確的建議。 – kanna

0

在Linux上,可以使用setsockopt/getsocktopt訪問send/recv超時。

執行man 7套接字並查找SO_RCVTIMEO和SO_SNDTIMEO選項。 setsockopt/getsockopt可用於Ruby中的套接字對象。