private void stop(TmphDomain domain)
 {
     TmphDomainSearcher removeDomains = null;
     TmphDomainServer domainServer = null;
     var domainData = domain.Domain.toLower();
     Monitor.Enter(domainLock);
     try
     {
         domains = domains.Remove(domainData, out removeDomains, out domainServer);
     }
     finally
     {
         Monitor.Exit(domainLock);
         if (removeDomains != null) removeDomains.Dispose();
     }
     if (domainServer != null && domainServer.Domains != null)
     {
         for (var index = domainServer.Domains.Length; index != 0;)
         {
             var stopDomain = domainServer.Domains[--index];
             if ((stopDomain.Value | (stopDomain.Key.Domain.Length ^ domainData.Length)) == 0
                 && Unsafe.TmphMemory.Equal(stopDomain.Key.Domain, domainData, domainData.Length)
                 && Interlocked.CompareExchange(ref domainServer.Domains[index].Value, 1, 0) == 0)
             {
                 if (!stopDomain.Key.IsOnlyHost) stop(stopDomain.Key.Host);
                 if (Interlocked.Decrement(ref domainServer.DomainCount) == 0) domainServer.Dispose();
                 break;
             }
         }
     }
 }
 private void stop(TmphDomain[] domains)
 {
     if (domains != null)
     {
         foreach (var domain in domains) stop(domain);
     }
 }
 /// <summary>
 ///     启动TCP服务
 /// </summary>
 /// <param name="domains">域名信息集合</param>
 /// <returns>HTTP服务启动状态</returns>
 private TmphStartState start(TmphDomain[] domains)
 {
     int hostCount = 0, startCount = 0;
     foreach (var domain in domains)
     {
         if (!domain.IsOnlyHost)
         {
             var state = start(domain.Host, domain.CertificateFileName);
             if (state != TmphStartState.Success) break;
             ++startCount;
         }
         ++hostCount;
     }
     if (startCount != 0 && hostCount == domains.Length) return TmphStartState.Success;
     foreach (var domain in domains)
     {
         if (hostCount-- == 0) break;
         if (!domain.IsOnlyHost) stop(domain.Host);
     }
     return TmphStartState.TcpError;
 }
        private TmphStartState start(string assemblyPath, string TServerType, TmphDomain[] domains, bool isShareAssembly)
        {
            if (isDisposed != 0) return TmphStartState.Disposed;
            if (domains.length() == 0) return TmphStartState.DomainError;
            var assemblyFile = new FileInfo(assemblyPath);
            if (!File.Exists(assemblyPath))
            {
                TmphLog.Error.Add("未找到程序集 " + assemblyPath, false, false);
                return TmphStartState.NotFoundAssembly;
            }
            var domainCount = 0;
            var state = TmphStartState.Unknown;
            var server = new TmphDomainServer
            {
                AssemblyPath = assemblyPath,
                ServerType = TServerType,
                Servers = this,
                IsShareAssembly = isShareAssembly
            };
            foreach (var domain in domains)
            {
                if ((state = checkDomain(ref domains[domainCount], server)) != TmphStartState.Success) break;
                ++domainCount;
            }
            try
            {
                if (state == TmphStartState.Success)
                {
                    state = TmphStartState.StartError;
                    Assembly assembly = null;
                    var directory = assemblyFile.Directory;
                    var domainFlags = domains.getArray(value => new TmphKeyValue<TmphDomain, int>(value, 0));
                    TmphHashString pathKey = assemblyPath;
                    Monitor.Enter(assemblyLock);
                    try
                    {
                        if (!isShareAssembly || !assemblyCache.TryGetValue(pathKey, out assembly))
                        {
                            var serverPath = this.serverPath + ((ulong)TmphPub.StartTime.Ticks).toHex16() +
                                             ((ulong)TmphPub.Identity).toHex16() + TmphDirectory.DirectorySeparator;
                            Directory.CreateDirectory(serverPath);
                            foreach (var file in directory.GetFiles()) file.CopyTo(serverPath + file.Name);
                            assembly = Assembly.LoadFrom(serverPath + assemblyFile.Name);
                            if (isShareAssembly) assemblyCache.Add(pathKey, assembly);
                        }
                    }
                    finally
                    {
                        Monitor.Exit(assemblyLock);
                    }
                    server.Server = (Http.TmphDomainServer)Activator.CreateInstance(assembly.GetType(TServerType));
                    var loadDirectory = directory;
                    do
                    {
                        var loadPath = loadDirectory.Name.ToLower();
                        if (loadPath == "release" || loadPath == "bin" || loadPath == "debug")
                        {
                            loadDirectory = loadDirectory.Parent;
                        }
                        else break;
                    } while (loadDirectory != null);
                    server.Server.LoadCheckPath = (loadDirectory ?? directory).FullName;
                    if (server.Server.Start(domains, server.RemoveFileWatcher))
                    {
                        fileWatcher.Add(directory.FullName);
                        server.FileWatcherPath = directory.FullName;
                        if ((state = start(domains)) == TmphStartState.Success)
                        {
                            server.DomainCount = domains.Length;
                            server.Domains = domainFlags;
                            server.IsStart = true;
                            TmphLog.Default.Add(@"domain success
" + domains.joinString(@"
", domain => domain.Host.Host + ":" + domain.Host.Port.toString() + "[" + domain.Domain.DeSerialize() + "]"), false,
                                false);
                            return TmphStartState.Success;
                        }
                    }
                }
            }
            catch (Exception error)
            {
                TmphLog.Error.Add(error, null, false);
            }
            foreach (var domain in domains)
            {
                if (domainCount-- == 0) break;
                removeDomain(domain);
            }
            server.Dispose();
            return state;
        }
 private TmphStartState start(string assemblyPath, string TServerType, TmphDomain domain, bool isShareAssembly)
 {
     return start(assemblyPath, TServerType, new[] { domain }, isShareAssembly);
 }
 /// <summary>
 ///     删除域名信息
 /// </summary>
 /// <param name="domain">域名信息</param>
 private void removeDomain(TmphDomain domain)
 {
     TmphDomainSearcher removeDomains = null;
     Monitor.Enter(domainLock);
     try
     {
         domains = domains.Remove(domain.Domain, out removeDomains);
     }
     finally
     {
         Monitor.Exit(domainLock);
         if (removeDomains != null) removeDomains.Dispose();
     }
 }
 /// <summary>
 ///     域名状态检测
 /// </summary>
 /// <param name="domain">域名信息</param>
 /// <param name="server">域名服务</param>
 /// <returns>域名状态</returns>
 private TmphStartState checkDomain(ref TmphDomain domain, TmphDomainServer server)
 {
     var domainData = domain.Domain;
     if (domain.Host.Port == 0) domain.Host.Port = domain.CertificateFileName == null ? 80 : 443;
     if (domainData == null)
     {
         var domainString = domain.Host.Host;
         if (domainString.Length() == 0) return TmphStartState.DomainError;
         if (domain.Host.Port != (domain.CertificateFileName == null ? 80 : 443))
         {
             domainString += ":" + domain.Host.Port.toString();
         }
         domain.Domain = domainData = domainString.GetBytes();
         TmphLog.Default.Add(domainString + " 缺少指定域名", false, false);
     }
     else if (domainData.Length == 0) return TmphStartState.DomainError;
     else if (domain.Host.Port != (domain.CertificateFileName == null ? 80 : 443) &&
              domainData.indexOf((byte)':') == -1)
     {
         domain.Domain =
             domainData = (domainData.DeSerialize() + ":" + domain.Host.Port.toString()).GetBytes();
     }
     if (!domain.Host.HostToIpAddress()) return TmphStartState.HostError;
     if (domain.CertificateFileName != null && !File.Exists(domain.CertificateFileName))
     {
         TmphLog.Error.Add("没有找到安全证书文件 " + domain.CertificateFileName, false, false);
         return TmphStartState.CertificateError;
     }
     domainData.toLower();
     TmphDomainSearcher removeDomains = null;
     Monitor.Enter(domainLock);
     try
     {
         domains = domains.Add(domainData, server, out removeDomains);
     }
     finally
     {
         Monitor.Exit(domainLock);
         if (removeDomains != null) removeDomains.Dispose();
     }
     return removeDomains == null ? TmphStartState.DomainExists : TmphStartState.Success;
 }