Ruby 2.4

IPSocket

class IPSocket

Parent:BasicSocket

IPSocket是TCPSocket和UDPSocket的超级类。

公共类方法

getaddress(host) → ipaddress Show source

查找主机的IP地址。

require 'socket' IPSocket.getaddress("localhost") #=> "127.0.0.1" IPSocket.getaddress("ip6-localhost") #=> "::1"

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 }

另外别名为:getaddress_orig

私有类方法

getaddress_orig(p1)

别名为:getaddress

valid_v6?(addr) Show source

# File lib/ipaddr.rb, line 623 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

公共实例方法

addr(reverse_lookup)→address_family,port,hostname,numeric_address()

以包含address_family,port,hostname和numeric_address的数组的形式返回本地地址。

如果reverse_lookuptrue:hostname,则使用反向查找从numeric_address获取主机名。或者如果是false,或者:numeric主机名与numeric_address相同。或者,如果它是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_addr(int argc, VALUE *argv, VALUE sock) { rb_io_t *fptr; union_sockaddr addr; socklen_t len = (socklen_t)sizeof addr; int norevlookup; GetOpenFile(sock, fptr if (argc < 1 || !rsock_revlookup_flag(argv[0], &norevlookup)) norevlookup = fptr->mode & FMODE_NOREVLOOKUP; if (getsockname(fptr->fd, &addr.addr, &len) < 0) rb_sys_fail("getsockname(2)" return rsock_ipaddr(&addr.addr, len, norevlookup }

peeraddr(reverse_lookup) → address_family, port, hostname, numeric_address()

以包含address_family,port,hostname和numeric_address的数组的形式返回远程地址。它是面向连接的套接字(如TCPSocket)定义的。

如果reverse_lookuptrue:hostname,则使用反向查找从numeric_address获取主机名。或者如果是false,或者:numeric主机名与numeric_address相同。或者,如果它是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_peeraddr(int argc, VALUE *argv, VALUE sock) { rb_io_t *fptr; union_sockaddr addr; socklen_t len = (socklen_t)sizeof addr; int norevlookup; GetOpenFile(sock, fptr if (argc < 1 || !rsock_revlookup_flag(argv[0], &norevlookup)) norevlookup = fptr->mode & FMODE_NOREVLOOKUP; if (getpeername(fptr->fd, &addr.addr, &len) < 0) rb_sys_fail("getpeername(2)" return rsock_ipaddr(&addr.addr, len, norevlookup }

recvfrom(maxlen) → mesg, ipaddr()

recvfrom(maxlen, flags) → mesg, ipaddr

接收消息并将消息作为字符串和消息来自的地址返回。

maxlen是要接收的最大字节数。

标志应该是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"]]

static VALUE ip_recvfrom(int argc, VALUE *argv, VALUE sock) { return rsock_s_recvfrom(sock, argc, argv, RECV_IP }