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
> >
> 
>