示例#1
0
 /// <summary>
 /// 删除域名服务信息
 /// </summary>
 /// <param name="domain"></param>
 /// <returns></returns>
 public domainSearcher Remove(byte[] domain, out domainSearcher removeDomains)
 {
     domainServer server;
     return Remove(domain, out removeDomains, out server);
 }
示例#2
0
 /// <summary>
 /// 删除域名服务信息
 /// </summary>
 /// <param name="domain"></param>
 /// <param name="server">域名服务信息</param>
 /// <returns></returns>
 public domainSearcher Remove(byte[] domain, out domainSearcher removeDomains, out domainServer server)
 {
     byte[][] domains = this.domains;
     domainServer[] servers = Servers;
     pointer data = this.data;
     if (data.Data != null && domain.Length != 0)
     {
         int index = new searcher(data).Search(domain);
         if (index >= 0)
         {
             domainSearcher searcher = Default;
             if (domains.Length != 1)
             {
                 int length = domains.Length - 1;
                 byte[][] newDomains = new byte[length][];
                 domainServer[] newServers = new domainServer[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 domainSearcher(newDomains, newServers);
             }
             server = servers[index];
             removeDomains = this;
             return searcher;
         }
     }
     server = null;
     removeDomains = null;
     return this;
 }
示例#3
0
 /// <summary>
 /// 添加域名服务信息
 /// </summary>
 /// <param name="domain"></param>
 /// <param name="server"></param>
 /// <returns></returns>
 public domainSearcher Add(byte[] domain, domainServer server, out domainSearcher removeDomains)
 {
     byte[][] domains = this.domains;
     domainServer[] servers = Servers;
     pointer data = this.data;
     if (domain.Length != 0 && ((data.Data == null || new searcher(data).Search(domain) < 0)))
     {
         byte[] 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++) ;
         }
         domainSearcher searcher = new domainSearcher(domains.getAdd(reverseDomain), servers.getAdd(server));
         removeDomains = this;
         return searcher;
     }
     removeDomains = null;
     return this;
 }
示例#4
0
 private unsafe void stop(domain domain)
 {
     domainSearcher removeDomains = null;
     domainServer domainServer = null;
     byte[] 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 (int index = domainServer.Domains.Length; index != 0; )
         {
             keyValue<domain, int> stopDomain = domainServer.Domains[--index];
             if ((stopDomain.Value | (stopDomain.Key.Domain.Length ^ domainData.Length)) == 0
                 && unsafer.memory.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;
             }
         }
     }
 }
示例#5
0
 /// <summary>
 /// 删除域名信息
 /// </summary>
 /// <param name="domain">域名信息</param>
 private void removeDomain(domain domain)
 {
     domainSearcher removeDomains = null;
     Monitor.Enter(domainLock);
     try
     {
         domains = domains.Remove(domain.Domain, out removeDomains);
     }
     finally
     {
         Monitor.Exit(domainLock);
         if (removeDomains != null) removeDomains.Dispose();
     }
 }
示例#6
0
 /// <summary>
 /// 域名状态检测
 /// </summary>
 /// <param name="domain">域名信息</param>
 /// <param name="server">域名服务</param>
 /// <returns>域名状态</returns>
 private startState checkDomain(ref domain domain, domainServer server)
 {
     byte[] domainData = domain.Domain;
     if (domain.Host.Port == 0) domain.Host.Port = domain.CertificateFileName == null ? 80 : 443;
     if (domainData == null)
     {
         string domainString = domain.Host.Host;
         if (domainString.length() == 0) return servers.startState.DomainError;
         if (domain.Host.Port != (domain.CertificateFileName == null ? 80 : 443))
         {
             domainString += ":" + domain.Host.Port.toString();
         }
         domain.Domain = domainData = domainString.getBytes();
         fastCSharp.log.Default.Add(domainString + " 缺少指定域名", false, false);
     }
     else if (domainData.Length == 0) return servers.startState.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 servers.startState.HostError;
     if (domain.CertificateFileName != null && !File.Exists(domain.CertificateFileName))
     {
         fastCSharp.log.Error.Add("没有找到安全证书文件 " + domain.CertificateFileName, false, false);
         return servers.startState.CertificateError;
     }
     domainData.toLower();
     domainSearcher 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 ? startState.DomainExists : servers.startState.Success;
 }
示例#7
0
        /// <summary>
        /// 释放资源
        /// </summary>
        public void Dispose()
        {
            if (Interlocked.Increment(ref isDisposed) == 1)
            {
                save();
                forwardHost = null;

                pub.Dispose(ref fileWatcher);

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

                server[] servers = null;
                Monitor.Enter(hostLock);
                try
                {
                    servers = hosts.Values.getArray();
                    hosts = null;
                }
                finally
                {
                    Monitor.Exit(hostLock);
                    if (servers != null) foreach (server server in servers) server.Dispose();
                }
            }
        }