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