I don't want to override the protocol's idea of a timeout - I'd like some means of specifying a timeout for the connection though. In every other language I've used, I can set a timeout value on the socket itself. It doesn't look like that's the case in Ruby. Is there a method somewhere in the Socket classe heirarchy that lets me specify a timeout? According to timeout, you can set an Exception that gets thrown when it times out. I set that to StandardError, and just handle StandardError at the end. According to the docs, Timeout::Error can't be used with rescue because it doesn't inherit from StandardError. I'd still like some means of setting a timeout value for a socket connection. That's a pretty basic aspect of the protocol, there's no reason it shouldn't be in there. On Apr 2, 2005 9:37 AM, Sam Roberts <sroberts / uniserve.com> wrote: > Quoting pergesu / gmail.com, on Sat, Apr 02, 2005 at 08:05:15PM +0900: > > I'm writing a little method that just tries to open a tcp socket > > connection, then closes it off. I'm using timeout to limit the amount > > of time it tries to connect (is there a better way?). If it times > > I have to wonder why you want to override the TCP protocols ideas of a > timeout. The protocol designers and implementors have a pretty good idea > of what the timeouts should be. If its not fast enough for you, you > probably want too much. Doing this will make your code flaky and > unreliable when the network isn't as fast as your local network. A good > text on network programming should explain this. If you are finding your > app is blocked, you can use ruby threads to do connections in the > background. > > That said, you can't catch exceptions like that, try: > > begin > Timeout::timeout(3) do > long running op > end > rescue Timeout::Error > p "hi" > end > > Sam > > > out, I just want to say that the connect failed. Despite catching the > > Timeout::Error (I think, anyway), I always get the Exception output. > > First, here's the method: > > > > def execute > > status = timeout(@timeoutval) { > > socket = TCPSocket.new(@host, @port) rescue false > > > > socket.close if socket > > return socket != false > > } rescue Timeout::Error > > > > return false > > end > > > > And now the output from my unit test: > > > > Started > > /usr/local/lib/ruby/1.8/timeout.rb:42:in `new': execution expired > > (Timeout::Error) > > from ./PortHostTest.rb:16:in `execute' > > from ./PortHostTest.rb:15:in `timeout' > > from /usr/local/lib/ruby/1.8/timeout.rb:55:in `timeout' > > from ./PortHostTest.rb:15:in `execute' > > from ./HostTest.rb:10:in `runTest' > > from ../tests/test_HostTest.rb:14:in `test_simple' > > from /usr/local/lib/ruby/1.8/test/unit/testcase.rb:70:in `__send__' > > from /usr/local/lib/ruby/1.8/test/unit/testcase.rb:70:in `run' > > ... 10 levels... > > from /usr/local/lib/ruby/1.8/test/unit/autorunner.rb:194:in `run' > > from /usr/local/lib/ruby/1.8/test/unit/autorunner.rb:14:in `run' > > from /usr/local/lib/ruby/1.8/test/unit.rb:285 > > from /usr/local/lib/ruby/1.8/test/unit.rb:283 > > > >