H
Henrik Warne
Hello,
I am trying to do a non-blocking connect for a TCP connection, and I
can't get it to work.
I have googled a lot without finding a solution.
I do the following in ruby:
#!/usr/bin/env ruby
require 'socket'
require 'fcntl'
client = Socket.new(Socket:F_INET, Socket::SOCK_STREAM, 0)
flags = client.fcntl(Fcntl::F_GETFL, 0)
client.fcntl(Fcntl::F_SETFL, flags | Fcntl::O_NONBLOCK)
flags = client.fcntl(Fcntl::F_GETFL, 0)
sockaddr = [Socket::AF_INET, 80, 10, 2, 20, 250, ''].pack('snCCCCa8')
client.connect(sockaddr)
client.send("GET something HTTP/1.1\r\n\r\n", 0)
$res = client.readlines
client.close
puts $res
There is no contact with 10.2.20.250:80, and I want the connect call to
return immediately with EINPROGRESS (or similar), so I can use select to
decide how long to wait before giving up (I haven't added the code to do
that since I can't get the connect to return immediately).
As it is now, the connect call hangs for three and a half minutes before
returning "Exception: Connection timed out - connect(2)"
I can successfully do this in C++ on the same machine, so I know it can
work. Am I missing something in the ruby code, or have I misunderstood
something?
I've tried this in ruby 1.6.8 (2002-12-24) [i386-linux] and
ruby 1.8.1 (2003-12-25) [i686-linux], and I'm using Debian GNU/Linux
3.0.
Thanks in advance.
/Henrik Warne
I am trying to do a non-blocking connect for a TCP connection, and I
can't get it to work.
I have googled a lot without finding a solution.
I do the following in ruby:
#!/usr/bin/env ruby
require 'socket'
require 'fcntl'
client = Socket.new(Socket:F_INET, Socket::SOCK_STREAM, 0)
flags = client.fcntl(Fcntl::F_GETFL, 0)
client.fcntl(Fcntl::F_SETFL, flags | Fcntl::O_NONBLOCK)
flags = client.fcntl(Fcntl::F_GETFL, 0)
sockaddr = [Socket::AF_INET, 80, 10, 2, 20, 250, ''].pack('snCCCCa8')
client.connect(sockaddr)
client.send("GET something HTTP/1.1\r\n\r\n", 0)
$res = client.readlines
client.close
puts $res
There is no contact with 10.2.20.250:80, and I want the connect call to
return immediately with EINPROGRESS (or similar), so I can use select to
decide how long to wait before giving up (I haven't added the code to do
that since I can't get the connect to return immediately).
As it is now, the connect call hangs for three and a half minutes before
returning "Exception: Connection timed out - connect(2)"
I can successfully do this in C++ on the same machine, so I know it can
work. Am I missing something in the ruby code, or have I misunderstood
something?
I've tried this in ruby 1.6.8 (2002-12-24) [i386-linux] and
ruby 1.8.1 (2003-12-25) [i686-linux], and I'm using Debian GNU/Linux
3.0.
Thanks in advance.
/Henrik Warne