gpt4 book ai didi

ruby - Ruby:Ruby Socket对象中的remote_address/local_address存放在哪里?

转载 作者:行者123 更新时间:2023-12-03 12:04:43 32 4
gpt4 key购买 nike

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

require 'socket'

local_socket = Socket.new(:INET, :STREAM)
local_addr = Socket.pack_sockaddr_in(4481, '0.0.0.0')
local_socket.bind(local_addr)
local_socket.listen(Socket::SOMAXCONN)

# accept a connection
connection, remote_addr = local_socket.accept

接受连接后,连接是一个全新的套接字对象,并且具有不同的文件描述符。
> 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>

我的问题是:

实例变量为空,此对象中的local_address/remote_address存放在哪里?

最佳答案

#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);
}

关于ruby - Ruby:Ruby Socket对象中的remote_address/local_address存放在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31846160/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com