Class: Async::IO::TCPSocket
- Inherits:
-
IPSocket
- Object
- Wrapper
- Generic
- BasicSocket
- IPSocket
- Async::IO::TCPSocket
- Includes:
- Peer
- Defined in:
- lib/async/io/tcp_socket.rb
Overview
Asynchronous TCP socket wrapper.
Direct Known Subclasses
Constant Summary
Constants inherited from Generic
Instance Attribute Summary collapse
-
#stream ⇒ Object
readonly
Returns the value of attribute stream.
Attributes inherited from Generic
Instance Method Summary collapse
- #close ⇒ Object
-
#initialize(remote_host, remote_port = nil, local_host = nil, local_port = nil) ⇒ TCPSocket
constructor
A new instance of TCPSocket.
- #sysread(size, buffer = nil) ⇒ Object
Methods included from Peer
#connected?, #eof, #eof?, #protocol, #sync, #sync=, #type
Methods inherited from Generic
#<<, #connected?, #dup, #nonblock, #nonblock=, #nonblock?, #read, #readable?, #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
#stream ⇒ Object (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
#close ⇒ Object
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 |