class Async::IO::Socket
def self.accept(*args, backlog: SOMAXCONN, &block)
def self.accept(*args, backlog: SOMAXCONN, &block) bind(*args) do |server, task| server.listen(backlog) if backlog server.accept_each(task: task, &block) end end
def self.bind(local_address, protocol: 0, reuse_port: false, task: Task.current, &block)
(**reuse_port)-
Allow(Boolean) -- this port to be bound in multiple processes. -
The(Integer) -- socket protocol to use.
Parameters:
-
local_address(Address) -- The local address to bind to.
def self.bind(local_address, protocol: 0, reuse_port: false, task: Task.current, &block) task.annotate "binding to #{local_address.inspect}" wrapper = build(local_address.afamily, local_address.socktype, protocol) do |socket| socket.setsockopt(::Socket::SOL_SOCKET, ::Socket::SO_REUSEADDR, true) socket.setsockopt(::Socket::SOL_SOCKET, ::Socket::SO_REUSEPORT, true) if reuse_port socket.bind(local_address.to_sockaddr) end if block_given? begin yield wrapper, task ensure wrapper.close end else return wrapper end end
def self.build(*args, task: Task.current)
def self.build(*args, task: Task.current) socket = ::Socket.new(*args) yield socket return self.new(socket, task.reactor) rescue Exception socket.close if socket raise end
def self.connect(remote_address, local_address = nil, task: Task.current)
(**protcol)-
The(Integer) -- socket protocol to use.
Parameters:
-
local_address(Addrinfo) -- The local address to bind to before connecting. -
remote_address(Addrinfo) -- The remote address to connect to.
def self.connect(remote_address, local_address = nil, task: Task.current) task.annotate "connecting to #{remote_address.inspect}" wrapper = build(remote_address.afamily, remote_address.socktype, remote_address.protocol) do |socket| socket.setsockopt(::Socket::SOL_SOCKET, ::Socket::SO_REUSEADDR, true) if local_address socket.bind(local_address.to_sockaddr) end self.new(socket, task.reactor) end begin wrapper.connect(remote_address.to_sockaddr) task.annotate "connected to #{remote_address.inspect}" rescue wrapper.close raise end if block_given? begin yield wrapper, task ensure wrapper.close end else return wrapper end end
def connect(*args)
def connect(*args) begin async_send(:connect_nonblock, *args) rescue Errno::EISCONN # We are now connected. end end