阻止Ruby常用的berkeley套接字有一個缺點:如果與遠程計算機的連接沒有正常結束,recv()
調用將等待幾個小時。通常,可以通過爲套接字指定接收超時來解決此問題。我在Windows 7和Ubuntu 11.10上都嘗試了下面的代碼和Ruby 1.9.3-p0。不幸的是,它不工作:?recv()
掛起永遠:(我在做什麼錯如何正確使用Ruby套接字的接收超時?
# server.rb
require 'socket'
Socket.tcp_server_loop(1234) { puts("connected") }
# client.rb
require 'socket'
sock = Socket.new(:INET, :STREAM)
time = if RUBY_PLATFORM =~ /mingw/ then 1000 else [ 1, 0 ].pack('L*') end
sock.setsockopt(Socket::SOL_SOCKET, Socket::SO_RCVTIMEO, time)
sock.connect(Socket.sockaddr_in(1234, "127.0.0.1"))
sock.recv(100)
我想讓'recv()'返回,如果遠程沒有響應。我的服務器不會故意模擬連接沒有正常終止的情況。我知道'超時'技巧,但我更有興趣研究'recv()'行爲。 – grigoryvp 2012-02-22 16:40:38
好的。我不知道使用Ruby的低級別Berkeley套接字。 – Linuxios 2012-02-23 01:04:32