Module: Async::IO::Peer

Includes:
Socket::Constants
Included in:
BasicSocket, SSLSocket, TCPSocket, UNIXSocket
Defined in:
lib/async/io/peer.rb

Instance Method Summary collapse

Instance Method Details

#connected?Boolean

Is it likely that the socket is still connected? May return false positive, but won’t return false negative.

Returns:

  • (Boolean)


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

#eofObject



32
33
34
# File 'lib/async/io/peer.rb', line 32

def eof
  !connected?
end

#eof?Boolean

Returns:

  • (Boolean)


36
37
38
# File 'lib/async/io/peer.rb', line 36

def eof?
  !connected?
end

#protocolObject



70
71
72
# File 'lib/async/io/peer.rb', line 70

def protocol
  self.local_address.protocol
end

#syncObject



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

#typeObject



66
67
68
# File 'lib/async/io/peer.rb', line 66

def type
  self.local_address.socktype
end