IPSocket is the parent of TCPSocket and UDPSocket and implements functionality common to them.
A number of APIs in IPSocket, Socket, and their descendants return an address as an array. The members of that array are:
address family: A string like “AF_INET” or “AF_INET6” if it is one of the commonly used families, the string “unknown:#” (where `#' is the address family number) if it is not one of the common ones. The strings map to the Socket::AF_* constants.
port: The port number.
name: Either the canonical name from looking the address up in the DNS, or the address in presentation format
address: The address in presentation format (a dotted decimal string for IPv4, a hex string for IPv6).
The address and port can be used directly to create sockets and to bind or connect them to the address.
static VALUE
ip_s_getaddress(obj, host)
VALUE obj, host;
{
struct sockaddr_storage addr;
struct addrinfo *res = sock_addrinfo(host, Qnil, SOCK_STREAM, 0);
/* just take the first one */
memcpy(&addr, res->ai_addr, res->ai_addrlen);
freeaddrinfo(res);
return make_ipaddr((struct sockaddr*)&addr);
}
static VALUE
ip_addr(sock)
VALUE sock;
{
OpenFile *fptr;
struct sockaddr_storage addr;
socklen_t len = sizeof addr;
GetOpenFile(sock, fptr);
if (getsockname(fileno(fptr->f), (struct sockaddr*)&addr, &len) < 0)
rb_sys_fail("getsockname(2)");
return ipaddr((struct sockaddr*)&addr);
}
static VALUE
ip_peeraddr(sock)
VALUE sock;
{
OpenFile *fptr;
struct sockaddr_storage addr;
socklen_t len = sizeof addr;
GetOpenFile(sock, fptr);
if (getpeername(fileno(fptr->f), (struct sockaddr*)&addr, &len) < 0)
rb_sys_fail("getpeername(2)");
return ipaddr((struct sockaddr*)&addr);
}