/* * call-seq: * socket.connect_nonblock(server_sockaddr) => 0 * * Requests a connection to be made on the given +server_sockaddr+ after * O_NONBLOCK is set for the underlying file descriptor. * Returns 0 if successful, otherwise an exception is raised. * * === Parameter * * +server_sockaddr+ - the +struct+ sockaddr contained in a string * * === Example: * # Pull down Google's web page * require 'socket' * include Socket::Constants * socket = Socket.new(AF_INET, SOCK_STREAM, 0) * sockaddr = Socket.sockaddr_in(80, 'www.google.com') * begin * socket.connect_nonblock(sockaddr) * rescue Errno::EINPROGRESS * IO.select(nil, [socket]) * begin * socket.connect_nonblock(sockaddr) * rescue Errno::EISCONN * end * end * socket.write("GET / HTTP/1.0\r\n\r\n") * results = socket.read * * Refer to Socket#connect for the exceptions that may be thrown if the call * to _connect_nonblock_ fails. * * Socket#connect_nonblock may raise any error corresponding to connect(2) failure, * including Errno::EINPROGRESS. * * === See * * Socket#connect */ static VALUE sock_connect_nonblock(sock, addr) VALUE sock, addr; { OpenFile *fptr; int n; StringValue(addr); addr = rb_str_new4(addr); GetOpenFile(sock, fptr); rb_io_set_nonblock(fptr); n = connect(fileno(fptr->f), (struct sockaddr*)RSTRING(addr)->ptr, RSTRING(addr)->len); if (n < 0) { rb_sys_fail("connect(2)"); } return INT2FIX(n); }