Ruby:哪里有remote_address / local_address存储在Ruby Socket对象中?

时间:2015-08-06 03:07:21

标签: ruby sockets

以下是一个非常简单的ruby服务器。

> connection.instance_variables
[]

> p connection.local_address
Local address: #<Addrinfo: 0.0.0.0:4481 TCP>

> p connection.remote_address
Remote address #<Addrinfo: 59.102.12.1:4481 TCP>

接受连接后,连接是一个全新的套接字对象,并且具有不同的文件描述符。

@Uri.EscapeDataString(Model.mapurl);

我的问题是:

实例变量为空,local_address / remote_address存储在此对象中?

1 个答案:

答案 0 :(得分:1)

#local_address#remote_address分别使用getsocknamegetpeername

来自Ruby source code, ext/socket/basicsocket.c

static VALUE
bsock_local_address(VALUE sock)
{
    union_sockaddr buf;
    socklen_t len = (socklen_t)sizeof buf;
    socklen_t len0 = len;
    rb_io_t *fptr;

    GetOpenFile(sock, fptr);
    if (getsockname(fptr->fd, &buf.addr, &len) < 0)
    rb_sys_fail("getsockname(2)");
    if (len0 < len) len = len0;
    return rsock_fd_socket_addrinfo(fptr->fd, &buf.addr, len);
}

static VALUE
bsock_remote_address(VALUE sock)
{
    union_sockaddr buf;
    socklen_t len = (socklen_t)sizeof buf;
    socklen_t len0 = len;
    rb_io_t *fptr;

    GetOpenFile(sock, fptr);
    if (getpeername(fptr->fd, &buf.addr, &len) < 0)
    rb_sys_fail("getpeername(2)");
    if (len0 < len) len = len0;
    return rsock_fd_socket_addrinfo(fptr->fd, &buf.addr, len);
}