class Raindrops::TCP_Info

This is used to wrap “struct tcp_info” as described in tcp(7) and /usr/include/linux/tcp.h. The following readers methods are defined corresponding to the “tcpi_” fields in the tcp_info struct.

As of raindrops 0.18.0+, this is supported on FreeBSD and OpenBSD systems as well as Linux, although not all fields exist or match the documentation, below.

In particular, the last_data_recv field is useful for measuring the amount of time a client spent in the listen queue before +accept()+, but only if TCP_DEFER_ACCEPT is used with the listen socket (it is on by default in Unicorn).

kernel.org/doc/man-pages/online/pages/man7/tcp.7.html

Public Class Methods

new(p1) click to toggle source
Raindrops::TCP_Info.new(tcp_socket)  -> TCP_Info object

Reads a TCP_Info object from any given tcp_socket. See the tcp(7) manpage and /usr/include/linux/tcp.h for more details.

static VALUE init(VALUE self, VALUE io)
{
        int fd = my_fileno(io);
        struct tcp_info *info = DATA_PTR(self);
        socklen_t len = (socklen_t)sizeof(struct tcp_info);
        int rc = getsockopt(fd, IPPROTO_TCP, TCP_INFO, info, &len);

        if (rc != 0)
                rb_sys_fail("getsockopt");

        return self;
}

Public Instance Methods

get!(p1) click to toggle source
info = Raindrops::TCP_Info.new(tcp_socket)
info.get!(tcp_socket)

Update an existing TCP_Info objects with the latest stats from the given socket. This even allows sharing TCP_Info objects between different sockets to avoid garbage.

static VALUE init(VALUE self, VALUE io)
{
        int fd = my_fileno(io);
        struct tcp_info *info = DATA_PTR(self);
        socklen_t len = (socklen_t)sizeof(struct tcp_info);
        int rc = getsockopt(fd, IPPROTO_TCP, TCP_INFO, info, &len);

        if (rc != 0)
                rb_sys_fail("getsockopt");

        return self;
}