Class: Async::IO::TCPSocket

Inherits:
IPSocket show all
Includes:
Peer
Defined in:
lib/async/io/tcp_socket.rb

Overview

Asynchronous TCP socket wrapper.

Direct Known Subclasses

TCPServer

Constant Summary

Constants inherited from Generic

Generic::WRAPPERS

Instance Attribute Summary collapse

Attributes inherited from Generic

#timeout

Instance Method Summary collapse

Methods included from Peer

#connected?, #eof, #eof?, #protocol, #sync, #sync=, #type

Methods inherited from Generic

#<<, #connected?, #dup, #nonblock, #nonblock=, #nonblock?, #read, #syswrite, #wait, wrap, wrap_blocking_method, wraps, #write

Constructor Details

#initialize(remote_host, remote_port = nil, local_host = nil, local_port = nil) ⇒ TCPSocket

Returns a new instance of TCPSocket.



17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/async/io/tcp_socket.rb', line 17

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: local_address)
    fd = socket.fcntl(Fcntl::F_DUPFD)
    Console.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
  
  @stream = Stream.new(self)
end

Instance Attribute Details

#streamObject (readonly)

Returns the value of attribute stream.



50
51
52
# File 'lib/async/io/tcp_socket.rb', line 50

def stream
  @stream
end

Instance Method Details

#closeObject



43
44
45
46
# File 'lib/async/io/tcp_socket.rb', line 43

def close
  @stream.flush
  super
end

#sysread(size, buffer = nil) ⇒ Object



55
56
57
58
59
60
61
62
63
# File 'lib/async/io/tcp_socket.rb', line 55

def sysread(size, buffer = nil)
  data = @stream.read_partial(size)
  
  if buffer
    buffer.replace(data)
  end
  
  return data
end