class Kgio::Socket
A generic socket class with Kgio::SocketMethods included. This is returned by all Kgio methods that accept(2) a connected stream socket.
Public Class Methods
Creates a generic Kgio::Socket object and initiates a non-blocking connection.
This may block and call any method defined to
kgio_wait_writable
for the class.
static VALUE kgio_connect(VALUE klass, VALUE addr) { return stream_connect(klass, addr, 1); }
If passed one argument, this is identical to ::connect. If passed two or three arguments, it uses its superclass method:
Socket.new(domain, socktype [, protocol ])
static VALUE kgio_new(int argc, VALUE *argv, VALUE klass) { if (argc == 1) /* backwards compat, the only way for kgio <= 2.7.4 */ return stream_connect(klass, argv[0], 1); return rb_call_super(argc, argv); }
Creates a generic Kgio::Socket object and initiates a non-blocking connection. The caller should select/poll on the socket for writability before attempting to write or optimistically attempt a write and handle :wait_writable or Errno::EAGAIN.
static VALUE kgio_start(VALUE klass, VALUE addr) { return stream_connect(klass, addr, 0); }
Public Instance Methods
Starts a TCP connection using TCP Fast Open. This uses a blocking sendto() syscall and is only available on Ruby 1.9 or later. This raises exceptions (including Errno::EINPROGRESS/Errno::EAGAIN) on errors. Using this is only recommended for blocking sockets.
Timeouts may be set with setsockopt:
s.setsockopt(:SOCKET, :SNDTIMEO, [1,0].pack("l_l_"))
static VALUE fastopen(VALUE sock, VALUE buf, VALUE addr) { struct tfo_args a; VALUE str = (TYPE(buf) == T_STRING) ? buf : rb_obj_as_string(buf); ssize_t w; a.fd = my_fileno(sock); a.buf = RSTRING_PTR(str); a.buflen = (size_t)RSTRING_LEN(str); a.addr = sockaddr_from(&a.addrlen, addr); /* n.b. rb_thread_blocking_region preserves errno */ w = (ssize_t)rb_thread_io_blocking_region(tfo_sendto, &a, a.fd); if (w < 0) rb_sys_fail("sendto"); if ((size_t)w == a.buflen) return Qnil; return rb_str_subseq(str, w, a.buflen - w); }