code: func (m *Memberlist) setAlive() error {
  	// Get the final advertise address from the transport, which may need
  	// to see which address we bound to.
  	addr, port, err := m.transport.FinalAdvertiseAddr(
  		m.config.AdvertiseAddr, m.config.AdvertisePort)
  	if err != nil {
  		return fmt.Errorf("Failed to get final advertise address: %v", err)
  	}
  
  	// Check if this is a public address without encryption
  	ipAddr, err := sockaddr.NewIPAddr(addr.String())
  	if err != nil {
  		return fmt.Errorf("Failed to parse interface addresses: %v", err)
  	}
  	ifAddrs := []sockaddr.IfAddr{
  		sockaddr.IfAddr{
  			SockAddr: ipAddr,
  		},
  	}
  	_, publicIfs, err := sockaddr.IfByRFC("6890", ifAddrs)
  	if len(publicIfs) > 0 && !m.config.EncryptionEnabled() {
  		m.logger.Printf("[WARN] memberlist: Binding to public address without encryption!")
  	}
  
  	// Set any metadata from the delegate.
  	var meta []byte
  	if m.config.Delegate != nil {
  		meta = m.config.Delegate.NodeMeta(MetaMaxSize)
  		if len(meta) > MetaMaxSize {
  			panic("Node meta data provided is longer than the limit")
  		}
  	}
  
  	a := alive{
  		Incarnation: m.nextIncarnation(),
  		Node:        m.config.Name,
  		Addr:        addr,
  		Port:        uint16(port),
  		Meta:        meta,
  		Vsn:         m.config.BuildVsnArray(),
  	}
  	m.aliveNode(&a, nil, true)
  	return nil
  }
docs: // setAlive is used to mark this node as being alive. This is the same
  // as if we received an alive notification our own network channel for
  // ourself.