code: def listen(self, address, ssl=False, family=0, flags=0, ipc=False, backlog=128):
          
          handles = []
          handle_args = ()
          if isinstance(address, six.string_types):
              handle_type = pyuv.Pipe
              handle_args = (ipc,)
              addresses = [address]
          elif isinstance(address, tuple):
              handle_type = pyuv.TCP
              result = getaddrinfo(address[0], address[1], family, socket.SOCK_STREAM,
                                   socket.IPPROTO_TCP, flags)
              addresses = [res[4] for res in result]
          elif isinstance(address, pyuv.Stream):
              handles.append(address)
              addresses = []
          else:
              raise TypeError('expecting a string, tuple or pyuv.Stream')
          for addr in addresses:
              handle = handle_type(self._hub.loop, *handle_args)
              try:
                  if compat.pyuv_pipe_helper(handle, handle_args, 'bind', addr):
                      handles.append(handle)
                      break
                  handle.bind(addr)
              except pyuv.error.UVError as e:
                  self._log.warning('bind error {!r}, skipping {}', e[0], saddr(addr))
                  continue
              handles.append(handle)
          addresses = []
          for handle in handles:
              if backlog is not None:
                  callback = functools.partial(self._on_new_connection, ssl=ssl)
                  handle.listen(callback, backlog)
                  addr = handle.getsockname()
                  self._log.debug('listen on {}', saddr(addr))
              addresses.append(addr)
          self._handles += handles
          self._addresses += addresses
docs: Create a new transport, bind it to *address*, and start listening
          for new connections.
  
          See :func:`create_server` for a description of *address* and the
          supported keyword arguments.