以下是一个非常简单的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存储在此对象中?
答案 0 :(得分:1)
#local_address
和#remote_address
分别使用getsockname
和getpeername
。
来自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);
}