class Async::IO::TCPSocket
Asynchronous TCP socket wrapper.
def initialize(remote_host, remote_port = nil, local_host = nil, local_port = nil)
def initialize(remote_host, remote_port = nil, local_host = nil, local_port = nil) if remote_host.is_a? ::TCPSocket super(remote_host) else remote_address = Addrinfo.tcp(remote_host, remote_port) local_address = Addrinfo.tcp(local_host, local_port) if local_host # We do this unusual dance to avoid leaking an "open" socket instance. socket = Socket.connect(remote_address, local_address) fd = socket.fcntl(Fcntl::F_DUPFD) Async.logger.debug(self) {"Connected to #{remote_address.inspect}: #{fd}"} socket.close super(::TCPSocket.for_fd(fd)) # The equivalent blocking operation. Unfortunately there is no trivial way to make this non-blocking. # super(::TCPSocket.new(remote_host, remote_port, local_host, local_port)) end @buffer = Stream.new(StreamWrapper.new(self)) end
def read(size, outbuf = nil)
def read(size, outbuf = nil) buffer = @buffer.read_partial(size) if outbuf outbuf.replace(buffer) end return buffer end
def write(*)
def write(*) @buffer.flush super end