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;
             }
         }
     }
 }
 /// <summary>
 ///     添加域名服务信息
 /// </summary>
 /// <param name="domain"></param>
 /// <param name="server"></param>
 /// <returns></returns>
 public TmphDomainSearcher Add(byte[] domain, TmphDomainServer server, out TmphDomainSearcher removeDomains)
 {
     var domains = this.domains;
     var servers = Servers;
     var data = this.data;
     if (domain.Length != 0 && ((data.Data == null || new TmphSearcher(data).Search(domain) < 0)))
     {
         var reverseDomain = new byte[domain.Length];
         fixed (byte* domainFixed = domain, reverseDomainFixed = reverseDomain)
         {
             for (
                 byte* start = domainFixed,
                     end = domainFixed + domain.Length,
                     write = reverseDomainFixed + domain.Length;
                 start != end;
                 *--write = *start++)
                 ;
         }
         var searcher = new TmphDomainSearcher(domains.getAdd(reverseDomain), servers.getAdd(server));
         removeDomains = this;
         return searcher;
     }
     removeDomains = null;
     return this;
 }
 /// <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;
 }
        /// <summary>
        ///     释放资源
        /// </summary>
        public void Dispose()
        {
            if (Interlocked.Increment(ref isDisposed) == 1)
            {
                save();
                forwardHost = null;

                TmphPub.Dispose(ref fileWatcher);

                Monitor.Enter(domainLock);
                var domains = this.domains;
                this.domains = TmphDomainSearcher.Default;
                Monitor.Exit(domainLock);
                domains.Close();
                domains.Dispose();

                TmphServer[] servers = null;
                Monitor.Enter(hostLock);
                try
                {
                    servers = hosts.Values.GetArray();
                    hosts = null;
                }
                finally
                {
                    Monitor.Exit(hostLock);
                    if (servers != null) foreach (var server in servers) server.Dispose();
                }
            }
        }
 /// <summary>
 ///     删除域名服务信息
 /// </summary>
 /// <param name="domain"></param>
 /// <param name="server">域名服务信息</param>
 /// <returns></returns>
 public TmphDomainSearcher Remove(byte[] domain, out TmphDomainSearcher removeDomains, out TmphDomainServer server)
 {
     var domains = this.domains;
     var servers = Servers;
     var data = this.data;
     if (data.Data != null && domain.Length != 0)
     {
         var index = new TmphSearcher(data).Search(domain);
         if (index >= 0)
         {
             var searcher = Default;
             if (domains.Length != 1)
             {
                 var length = domains.Length - 1;
                 var newDomains = new byte[length][];
                 var newServers = new TmphDomainServer[length];
                 Array.Copy(domains, 0, newDomains, 0, index);
                 Array.Copy(servers, 0, newServers, 0, index);
                 Array.Copy(domains, index + 1, newDomains, index, length - index);
                 Array.Copy(servers, index + 1, newServers, index, length - index);
                 searcher = new TmphDomainSearcher(newDomains, newServers);
             }
             server = servers[index];
             removeDomains = this;
             return searcher;
         }
     }
     server = null;
     removeDomains = null;
     return this;
 }
 /// <summary>
 ///     删除域名服务信息
 /// </summary>
 /// <param name="domain"></param>
 /// <returns></returns>
 public TmphDomainSearcher Remove(byte[] domain, out TmphDomainSearcher removeDomains)
 {
     TmphDomainServer server;
     return Remove(domain, out removeDomains, out server);
 }