From: Kem Mason Date: 2008-11-14T06:36:18+09:00 Subject: Re: How to set socket option SO_RCVTIMEO I tried something like that, and it never timed out -- so after your post, I tried the following (the server I'm connecting to reads a CRLF terminated string, and returns a response after X seconds (150 in this case)) sock = TCPSocket.new('foodlinux', 3232) => # opt = [1, 1].pack("I_2") => "\001\000\000\000\001\000\000\000" sock.setsockopt(Socket::SOL_SOCKET, Socket::SO_RCVTIMEO, opt) => 0 sock.write("150\r\n") => 5 puts "read: #{sock.gets}" .... it never times out -- seems like it should return after 1.000001 seconds regardless of the byte ordering. What am I missing here? Brian Candler wrote: > Zakaria wrote: >> How to set socket option SO_RCVTIMEO in Windows XP? >> The C version use somekind struct. > > First, read the option: > > irb(main):001:0> require 'socket' > => true > irb(main):002:0> s = TCPServer.new(1234) > => # > irb(main):003:0> s.getsockopt(Socket::SOL_SOCKET, Socket::SO_RCVTIMEO) > => "\000\000\000\000\000\000\000\000" > > So if it's a struct timeval, that's a 32-bit tv_sec followed by a 32-bit > tv_usec. Not clear about the byte order, though, since it's all zero > here. > > So let's try native byte ordering, to set a timeout of 1.5 seconds (1 > second + 500,000 microseconds): > > irb(main):008:0> n = [1, 500_000].pack("I_2") > => "\001\000\000\000 \241\a\000" > irb(main):009:0> s.setsockopt(Socket::SOL_SOCKET, Socket::SO_RCVTIMEO, n > ) > => 0 > irb(main):010:0> s.accept > Errno::EAGAIN: Resource temporarily unavailable > from (irb):10:in `accept' > from (irb):10 > from :0 > > Yep, there was a pause of 1.5 seconds before the exception was raised. > > Look OK? -- Posted via http://www.ruby-forum.com/.