Class: IPSocket

Inherits:
BasicSocket show all
Defined in:
lib/ipaddr.rb,
ext/socket/socket.c

Class Method Summary (collapse)

Methods inherited from IO

#ready?, #scanf, #wait

Class Method Details

+ (Object) getaddress(host)



51
52
53
54
55
56
57
# File 'lib/ipaddr.rb', line 51

def getaddress(host)
  begin
    return Resolv.getaddress(host).to_s
  rescue Resolv::ResolvError
    raise SocketError, "Hostname not known: #{host}"
  end
end

+ (Object) getaddress_orig



50
# File 'lib/ipaddr.rb', line 50

alias getaddress_orig getaddress

+ (Object) original_resolv_getaddress



5
6
7
8
9
10
11
12
13
# File 'lib/resolv-replace.rb', line 5

def getaddress(s)
  if valid?(s)
    s
  elsif /\A[-A-Za-z\d.]+\Z/ =~ s
    getaddress_orig(s)
  else
    raise ArgumentError, "invalid address"
  end
end

+ (Boolean) valid?(addr)

Returns:

  • (Boolean)


46
47
48
# File 'lib/ipaddr.rb', line 46

def valid?(addr)
  valid_v4?(addr) || valid_v6?(addr)
end

+ (Boolean) valid_v4?(addr)

Returns:

  • (Boolean)


26
27
28
29
30
31
# File 'lib/ipaddr.rb', line 26

def valid_v4?(addr)
  if /\A(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\Z/ =~ addr
    return $~.captures.all? {|i| i.to_i < 256}
  end
  return false
end

+ (Boolean) valid_v6?(addr)

Returns:

  • (Boolean)


33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/ipaddr.rb', line 33

def valid_v6?(addr)
  # IPv6 (normal)
  return true if /\A[\dA-Fa-f]{1,4}(:[\dA-Fa-f]{1,4})*\Z/ =~ addr
  return true if /\A[\dA-Fa-f]{1,4}(:[\dA-Fa-f]{1,4})*::([\dA-Fa-f]{1,4}(:[\dA-Fa-f]{1,4})*)?\Z/ =~ addr
  return true if /\A::([\dA-Fa-f]{1,4}(:[\dA-Fa-f]{1,4})*)?\Z/ =~ addr
  # IPv6 (IPv4 compat)
  return true if /\A[\dA-Fa-f]{1,4}(:[\dA-Fa-f]{1,4})*:/ =~ addr && valid_v4?($')
  return true if /\A[\dA-Fa-f]{1,4}(:[\dA-Fa-f]{1,4})*::([\dA-Fa-f]{1,4}(:[\dA-Fa-f]{1,4})*:)?/ =~ addr && valid_v4?($')
  return true if /\A::([\dA-Fa-f]{1,4}(:[\dA-Fa-f]{1,4})*:)?/ =~ addr && valid_v4?($')

  false
end