类 IPSocket
公共类方法
源代码
static VALUE
ip_s_getaddress(VALUE obj, VALUE host)
{
union_sockaddr addr;
struct rb_addrinfo *res = rsock_addrinfo(host, Qnil, AF_UNSPEC, SOCK_STREAM, 0);
socklen_t len = res->ai->ai_addrlen;
/* just take the first one */
memcpy(&addr, res->ai->ai_addr, len);
rb_freeaddrinfo(res);
return rsock_make_ipaddr(&addr.addr, len);
}
查找 host 的 IP 地址。
require 'socket' IPSocket.getaddress("localhost") #=> "127.0.0.1" IPSocket.getaddress("ip6-localhost") #=> "::1"
也别名为:getaddress_orig
私有类方法
源代码
# File lib/ipaddr.rb, line 803 def valid_v6?(addr) case addr when IPAddr::RE_IPV6ADDRLIKE_FULL if $2 $~[2,4].all? {|i| i.to_i < 256 } else true end when IPAddr::RE_IPV6ADDRLIKE_COMPRESSED if $4 addr.count(':') <= 6 && $~[4,4].all? {|i| i.to_i < 256} else addr.count(':') <= 7 end else false end end
公共实例方法
源代码
static VALUE
ip_addr(int argc, VALUE *argv, VALUE sock)
{
union_sockaddr addr;
socklen_t len = (socklen_t)sizeof addr;
int norevlookup;
if (argc < 1 || !rsock_revlookup_flag(argv[0], &norevlookup))
norevlookup = rb_io_mode(sock) & FMODE_NOREVLOOKUP;
if (getsockname(rb_io_descriptor(sock), &addr.addr, &len) < 0)
rb_sys_fail("getsockname(2)");
return rsock_ipaddr(&addr.addr, len, norevlookup);
}
返回本地地址,它是一个包含地址族、端口、主机名和数字地址的数组。
如果 reverse_lookup 为 true 或 :hostname,则使用反向查找从数字地址获取主机名。或者,如果它是 false 或 :numeric,则主机名与数字地址相同。或者,如果它是 nil 或省略,则遵循 ipsocket.do_not_reverse_lookup。另请参阅 Socket.getaddrinfo。
TCPSocket.open("www.ruby-lang.org", 80) {|sock| p sock.addr #=> ["AF_INET", 49429, "hal", "192.168.0.128"] p sock.addr(true) #=> ["AF_INET", 49429, "hal", "192.168.0.128"] p sock.addr(false) #=> ["AF_INET", 49429, "192.168.0.128", "192.168.0.128"] p sock.addr(:hostname) #=> ["AF_INET", 49429, "hal", "192.168.0.128"] p sock.addr(:numeric) #=> ["AF_INET", 49429, "192.168.0.128", "192.168.0.128"] }
源代码
static VALUE
ip_inspect(VALUE sock)
{
VALUE str = rb_call_super(0, 0);
rb_io_t *fptr = RFILE(sock)->fptr;
union_sockaddr addr;
socklen_t len = (socklen_t)sizeof addr;
ID id;
if (fptr && fptr->fd >= 0 &&
getsockname(fptr->fd, &addr.addr, &len) >= 0 &&
(id = rsock_intern_family(addr.addr.sa_family)) != 0) {
VALUE family = rb_id2str(id);
char hbuf[1024], pbuf[1024];
long slen = RSTRING_LEN(str);
const char last = (slen > 1 && RSTRING_PTR(str)[slen - 1] == '>') ?
(--slen, '>') : 0;
str = rb_str_subseq(str, 0, slen);
rb_str_cat_cstr(str, ", ");
rb_str_append(str, family);
if (!rb_getnameinfo(&addr.addr, len, hbuf, sizeof(hbuf),
pbuf, sizeof(pbuf), NI_NUMERICHOST | NI_NUMERICSERV)) {
rb_str_cat_cstr(str, ", ");
rb_str_cat_cstr(str, hbuf);
rb_str_cat_cstr(str, ", ");
rb_str_cat_cstr(str, pbuf);
}
if (last) rb_str_cat(str, &last, 1);
}
return str;
}
返回描述此 IPSocket 对象的字符串。
源代码
static VALUE
ip_peeraddr(int argc, VALUE *argv, VALUE sock)
{
union_sockaddr addr;
socklen_t len = (socklen_t)sizeof addr;
int norevlookup;
if (argc < 1 || !rsock_revlookup_flag(argv[0], &norevlookup))
norevlookup = rb_io_mode(sock) & FMODE_NOREVLOOKUP;
if (getpeername(rb_io_descriptor(sock), &addr.addr, &len) < 0)
rb_sys_fail("getpeername(2)");
return rsock_ipaddr(&addr.addr, len, norevlookup);
}
返回远程地址,它是一个包含地址族、端口、主机名和数字地址的数组。它为面向连接的套接字(如 TCPSocket)定义。
如果 reverse_lookup 为 true 或 :hostname,则使用反向查找从数字地址获取主机名。或者,如果它是 false 或 :numeric,则主机名与数字地址相同。或者,如果它是 nil 或省略,则遵循 ipsocket.do_not_reverse_lookup。另请参阅 Socket.getaddrinfo。
TCPSocket.open("www.ruby-lang.org", 80) {|sock| p sock.peeraddr #=> ["AF_INET", 80, "carbon.ruby-lang.org", "221.186.184.68"] p sock.peeraddr(true) #=> ["AF_INET", 80, "carbon.ruby-lang.org", "221.186.184.68"] p sock.peeraddr(false) #=> ["AF_INET", 80, "221.186.184.68", "221.186.184.68"] p sock.peeraddr(:hostname) #=> ["AF_INET", 80, "carbon.ruby-lang.org", "221.186.184.68"] p sock.peeraddr(:numeric) #=> ["AF_INET", 80, "221.186.184.68", "221.186.184.68"] }
源代码
static VALUE
ip_recvfrom(int argc, VALUE *argv, VALUE sock)
{
return rsock_s_recvfrom(sock, argc, argv, RECV_IP);
}
接收一条消息并返回消息(字符串形式)和消息来源的地址。
maxlen 是要接收的最大字节数。
flags 应该是 Socket::MSG_* 常量的按位或。
ipaddr 与 IPSocket#{peeraddr,addr} 相同。
u1 = UDPSocket.new u1.bind("127.0.0.1", 4913) u2 = UDPSocket.new u2.send "uuuu", 0, "127.0.0.1", 4913 p u1.recvfrom(10) #=> ["uuuu", ["AF_INET", 33230, "localhost", "127.0.0.1"]]