class DEVp2p::Discovery::Address

Attributes

udp_port[RW]

Public Class Methods

from_endpoint(ip, udp_port, tcp_port="\x00\x00") click to toggle source
# File lib/devp2p/discovery/address.rb, line 12
def self.from_endpoint(ip, udp_port, tcp_port="\x00\x00")
  new(ip, udp_port, tcp_port, true)
end
new(ip, udp_port, tcp_port=nil, from_binary=false) click to toggle source
# File lib/devp2p/discovery/address.rb, line 16
def initialize(ip, udp_port, tcp_port=nil, from_binary=false)
  tcp_port ||= udp_port

  if from_binary
    raise ArgumentError, "invalid ip" unless [4,16].include?(ip.size)

    @udp_port = dec_port udp_port
    @tcp_port = dec_port tcp_port
  else
    raise ArgumentError, "udp_port must be Integer" unless udp_port.is_a?(Integer)
    raise ArgumentError, "tcp_port must be Integer" unless tcp_port.is_a?(Integer)

    @udp_port = udp_port
    @tcp_port = tcp_port
  end

  begin
    @ip = from_binary ? IPAddr.new_ntoh(ip) : IPAddr.new(ip)
  rescue IPAddr::InvalidAddressError => e
    ips = Resolv.getaddresses(ip).sort {|addr| addr =~ /:/ ? 1 : 0 } # use ipv4 first
    raise e if ips.empty?
    @ip = ips[0]
  end
end

Public Instance Methods

==(other) click to toggle source

addresses equal if they share ip and udp_port

# File lib/devp2p/discovery/address.rb, line 52
def ==(other)
  [ip, udp_port] == [other.ip, other.udp_port]
end
ip() click to toggle source
# File lib/devp2p/discovery/address.rb, line 41
def ip
  @ip.to_s
end
to_b() click to toggle source
# File lib/devp2p/discovery/address.rb, line 64
def to_b
  [@ip.hton, enc_port(udp_port), enc_port(tcp_port)]
end
Also aliased as: to_endpoint
to_endpoint()
Alias for: to_b
to_h() click to toggle source
# File lib/devp2p/discovery/address.rb, line 60
def to_h
  {ip: ip, udp_port: udp_port, tcp_port: tcp_port}
end
to_s() click to toggle source
# File lib/devp2p/discovery/address.rb, line 56
def to_s
  "Address(#{ip}:#{udp_port})"
end
update(addr) click to toggle source
# File lib/devp2p/discovery/address.rb, line 45
def update(addr)
  @tcp_port = addr.tcp_port if @tcp_port.nil? || @tcp_port == 0
end

Private Instance Methods

dec_port(b) click to toggle source
# File lib/devp2p/discovery/address.rb, line 75
def dec_port(b)
  Utils.big_endian_to_int(b)
end
enc_port(p) click to toggle source
# File lib/devp2p/discovery/address.rb, line 71
def enc_port(p)
  Utils.int_to_big_endian4(p)[-2..-1]
end