Module: Async::IO::Peer
- Includes:
- Socket::Constants
- Included in:
- BasicSocket, SSLSocket, TCPSocket, UNIXSocket
- Defined in:
- lib/async/io/peer.rb
Instance Method Summary collapse
-
#connected? ⇒ Boolean
Is it likely that the socket is still connected? May return false positive, but won’t return false negative.
- #eof ⇒ Object
- #eof? ⇒ Boolean
- #protocol ⇒ Object
- #sync ⇒ Object
-
#sync=(value) ⇒ Object
Best effort to set *_NODELAY if it makes sense.
- #type ⇒ Object
Instance Method Details
#connected? ⇒ Boolean
Is it likely that the socket is still connected? May return false positive, but won’t return false negative.
15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
# File 'lib/async/io/peer.rb', line 15 def connected? return false if @io.closed? # If we can wait for the socket to become readable, we know that the socket may still be open. result = to_io.recv_nonblock(1, MSG_PEEK, exception: false) # No data was available - newer Ruby can return nil instead of empty string: return false if result.nil? # Either there was some data available, or we can wait to see if there is data avaialble. return !result.empty? || result == :wait_readable rescue Errno::ECONNRESET # This might be thrown by recv_nonblock. return false end |
#eof ⇒ Object
32 33 34 |
# File 'lib/async/io/peer.rb', line 32 def eof !connected? end |
#eof? ⇒ Boolean
36 37 38 |
# File 'lib/async/io/peer.rb', line 36 def eof? !connected? end |
#protocol ⇒ Object
70 71 72 |
# File 'lib/async/io/peer.rb', line 70 def protocol self.local_address.protocol end |
#sync ⇒ Object
57 58 59 60 61 62 63 64 |
# File 'lib/async/io/peer.rb', line 57 def sync case self.protocol when IPPROTO_TCP self.getsockopt(IPPROTO_TCP, TCP_NODELAY).bool else true end && super end |
#sync=(value) ⇒ Object
Best effort to set *_NODELAY if it makes sense. Swallows errors where possible.
41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
# File 'lib/async/io/peer.rb', line 41 def sync=(value) super case self.protocol when 0, IPPROTO_TCP self.setsockopt(IPPROTO_TCP, TCP_NODELAY, value ? 1 : 0) else Console.logger.warn(self) {"Unsure how to sync=#{value} for #{self.protocol}!"} end rescue Errno::EINVAL # On Darwin, sometimes occurs when the connection is not yet fully formed. Empirically, TCP_NODELAY is enabled despite this result. rescue Errno::EOPNOTSUPP # Some platforms may simply not support the operation. # Console.logger.warn(self) {"Unable to set sync=#{value}!"} end |
#type ⇒ Object
66 67 68 |
# File 'lib/async/io/peer.rb', line 66 def type self.local_address.socktype end |