class BasicSocket

def readable?

def readable?
	# Is it likely that the socket is still connected?
	# May return false positive, but won't return false negative.
	return false unless super
	
	# 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