/* :nodoc: */ static VALUE tcp_accept_nonblock(VALUE sock, VALUE ex) { rb_io_t *fptr; union_sockaddr from; socklen_t len = (socklen_t)sizeof(from); GetOpenFile(sock, fptr); return rsock_s_accept_nonblock(rb_cTCPSocket, ex, fptr, &from.addr, &len); }
/* * call-seq: * tcpserver.accept_nonblock([options]) => tcpsocket * * Accepts an incoming connection using accept(2) after * O_NONBLOCK is set for the underlying file descriptor. * It returns an accepted TCPSocket for the incoming connection. * * === Example * require 'socket' * serv = TCPServer.new(2202) * begin # emulate blocking accept * sock = serv.accept_nonblock * rescue IO::WaitReadable, Errno::EINTR * IO.select([serv]) * retry * end * # sock is an accepted socket. * * Refer to Socket#accept for the exceptions that may be thrown if the call * to TCPServer#accept_nonblock fails. * * TCPServer#accept_nonblock may raise any error corresponding to accept(2) failure, * including Errno::EWOULDBLOCK. * * If the exception is Errno::EWOULDBLOCK, Errno::AGAIN, Errno::ECONNABORTED, Errno::EPROTO, * it is extended by IO::WaitReadable. * So IO::WaitReadable can be used to rescue the exceptions for retrying accept_nonblock. * * By specifying `exception: false`, the options hash allows you to indicate * that accept_nonblock should not raise an IO::WaitReadable exception, but * return the symbol :wait_readable instead. * * === See * * TCPServer#accept * * Socket#accept */ static VALUE tcp_accept_nonblock(int argc, VALUE *argv, VALUE sock) { rb_io_t *fptr; union_sockaddr from; socklen_t fromlen; GetOpenFile(sock, fptr); fromlen = (socklen_t)sizeof(from); return rsock_s_accept_nonblock(argc, argv, rb_cTCPSocket, fptr, &from.addr, &fromlen); }
/* * call-seq: * unixserver.accept_nonblock([options]) => unixsocket * * Accepts an incoming connection using accept(2) after * O_NONBLOCK is set for the underlying file descriptor. * It returns an accepted UNIXSocket for the incoming connection. * * === Example * require 'socket' * serv = UNIXServer.new("/tmp/sock") * begin # emulate blocking accept * sock = serv.accept_nonblock * rescue IO::WaitReadable, Errno::EINTR * IO.select([serv]) * retry * end * # sock is an accepted socket. * * Refer to Socket#accept for the exceptions that may be thrown if the call * to UNIXServer#accept_nonblock fails. * * UNIXServer#accept_nonblock may raise any error corresponding to accept(2) failure, * including Errno::EWOULDBLOCK. * * If the exception is Errno::EWOULDBLOCK, Errno::EAGAIN, Errno::ECONNABORTED or Errno::EPROTO, * it is extended by IO::WaitReadable. * So IO::WaitReadable can be used to rescue the exceptions for retrying accept_nonblock. * * By specifying `exception: false`, the options hash allows you to indicate * that accept_nonblock should not raise an IO::WaitReadable exception, but * return the symbol :wait_readable instead. * * === See * * UNIXServer#accept * * Socket#accept */ static VALUE unix_accept_nonblock(int argc, VALUE *argv, VALUE sock) { rb_io_t *fptr; struct sockaddr_un from; socklen_t fromlen; GetOpenFile(sock, fptr); fromlen = (socklen_t)sizeof(from); return rsock_s_accept_nonblock(argc, argv, rb_cUNIXSocket, fptr, (struct sockaddr *)&from, &fromlen); }
/* * call-seq: * tcpserver.accept_nonblock => tcpsocket * * Accepts an incoming connection using accept(2) after * O_NONBLOCK is set for the underlying file descriptor. * It returns an accepted TCPSocket for the incoming connection. * * === Example * require 'socket' * serv = TCPServer.new(2202) * begin # emulate blocking accept * sock = serv.accept_nonblock * rescue IO::WaitReadable, Errno::EINTR * IO.select([serv]) * retry * end * # sock is an accepted socket. * * Refer to Socket#accept for the exceptions that may be thrown if the call * to TCPServer#accept_nonblock fails. * * TCPServer#accept_nonblock may raise any error corresponding to accept(2) failure, * including Errno::EWOULDBLOCK. * * If the exception is Errno::EWOULDBLOCK, Errno::AGAIN, Errno::ECONNABORTED, Errno::EPROTO, * it is extended by IO::WaitReadable. * So IO::WaitReadable can be used to rescue the exceptions for retrying accept_nonblock. * * === See * * TCPServer#accept * * Socket#accept */ static VALUE tcp_accept_nonblock(VALUE sock) { rb_io_t *fptr; struct sockaddr_storage from; socklen_t fromlen; GetOpenFile(sock, fptr); fromlen = sizeof(from); return rsock_s_accept_nonblock(rb_cTCPSocket, fptr, (struct sockaddr *)&from, &fromlen); }