code: def recv(self, timeout=None):
          
          start = time()
          time_left = timeout
  
          while True:
  
              # try to get a message
              msg, already_filtered = self._recv_internal(timeout=time_left)
  
              # return it, if it matches
              if msg and (already_filtered or self._matches_filters(msg)):
                  LOG.log(self.RECV_LOGGING_LEVEL, 'Received: %s', msg)
                  return msg
  
              # if not, and timeout is None, try indefinitely
              elif timeout is None:
                  continue
  
              # try next one only if there still is time, and with
              # reduced timeout
              else:
  
                  time_left = timeout - (time() - start)
  
                  if time_left > 0:
                      continue
                  else:
                      return None
docs: Block waiting for a message from the Bus.
  
          :type timeout: float or None
          :param timeout:
              seconds to wait for a message or None to wait indefinitely
  
          :rtype: can.Message or None
          :return:
              None on timeout or a :class:`can.Message` object.
          :raises can.CanError:
              if an error occurred while reading