docs: def create_n_connect(self,
                           socket_type,
                           address: str,
                           bind=False,
                           on_error='log',
                           socket_name=''):
          """
          Creates and connects or binds the sockets
          on_error:
              'log': will log error
              'exit': will exit the program
          socket_name:
              used for troubleshooting/logging
          """
          self.logger.debug('create and connect: %s %s %s',
                            socket_type, socket_name, address)
  
          socket = self.context.socket(socket_type)
          if self.using_auth:
              self._create_using_auth(socket, address, bind, on_error, socket_name)
          else:
              self._create_no_auth(socket, address, bind, on_error, socket_name)
  
          return socket