Class: Async::IO::HostEndpoint

Inherits:
Endpoint
  • Object
show all
Defined in:
lib/async/io/host_endpoint.rb

Instance Attribute Summary

Attributes inherited from Endpoint

#options

Instance Method Summary collapse

Methods inherited from Endpoint

#accept, #bound, composite, each, #linger, #local_address, parse, #reuse_address, #reuse_port, socket, ssl, tcp, #timeout, try_convert, udp, unix, #with

Constructor Details

#initialize(specification, **options) ⇒ HostEndpoint

Returns a new instance of HostEndpoint.



13
14
15
16
17
# File 'lib/async/io/host_endpoint.rb', line 13

def initialize(specification, **options)
	super(**options)
	
	@specification = specification
end

Instance Method Details

#addressObject



25
26
27
# File 'lib/async/io/host_endpoint.rb', line 25

def address
	@specification
end

#bind {|Socket| ... } ⇒ Array<Socket>

Invokes the given block for every address which can be bound to.

Yields:

  • (Socket)

    the bound socket

Returns:

  • (Array<Socket>)

    an array of bound sockets



64
65
66
67
68
# File 'lib/async/io/host_endpoint.rb', line 64

def bind(&block)
	Addrinfo.foreach(*@specification).map do |address|
		Socket.bind(address, **@options, &block)
	end
end

#connect {|Socket| ... } ⇒ Socket

Try to connect to the given host by connecting to each address in sequence until a connection is made.

Yields:

  • (Socket)

    the socket which is being connected, may be invoked more than once

Returns:

  • (Socket)

    the connected socket

Raises:

  • if no connection could complete successfully



37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/async/io/host_endpoint.rb', line 37

def connect
	last_error = nil
	
	task = Task.current
	
	Addrinfo.foreach(*@specification) do |address|
		begin
			wrapper = Socket.connect(address, **@options, task: task)
		rescue Errno::ECONNREFUSED, Errno::ENETUNREACH, Errno::EAGAIN
			last_error = $!
		else
			return wrapper unless block_given?
			
			begin
				return yield wrapper, task
			ensure
				wrapper.close
			end
		end
	end
	
	raise last_error
end

#each {|AddressEndpoint| ... } ⇒ Object

Yields:

  • (AddressEndpoint)

    address endpoints by resolving the given host specification



71
72
73
74
75
76
77
# File 'lib/async/io/host_endpoint.rb', line 71

def each
	return to_enum unless block_given?
	
	Addrinfo.foreach(*@specification) do |address|
		yield AddressEndpoint.new(address, **@options)
	end
end

#hostnameObject



29
30
31
# File 'lib/async/io/host_endpoint.rb', line 29

def hostname
	@specification.first
end

#to_sObject



19
20
21
22
23
# File 'lib/async/io/host_endpoint.rb', line 19

def to_s
	nodename, service, family, socktype, protocol, flags = @specification
	
	"\#<#{self.class} name=#{nodename.inspect} service=#{service.inspect} family=#{family.inspect} type=#{socktype.inspect} protocol=#{protocol.inspect} flags=#{flags.inspect}>"
end