首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

IPSocket

Parent:BasicSocket

IPSocket是TCPSocket和UDPSocket的超级类。

公共类方法

getaddress(host) → ipaddress Show source

查找主机的IP地址。

代码语言:javascript
复制
require 'socket'

IPSocket.getaddress("localhost")     #=> "127.0.0.1"
IPSocket.getaddress("ip6-localhost") #=> "::1"
代码语言:javascript
复制
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

代码语言:javascript
复制
# 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

代码语言:javascript
复制
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"]
}
代码语言:javascript
复制
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

代码语言:javascript
复制
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"]
}
代码语言:javascript
复制
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}相同。

代码语言:javascript
复制
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"]]
代码语言:javascript
复制
static VALUE
ip_recvfrom(int argc, VALUE *argv, VALUE sock)
{
    return rsock_s_recvfrom(sock, argc, argv, RECV_IP);
}

扫码关注腾讯云开发者

领取腾讯云代金券

http://www.vxiaotou.com