/// <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); }
/// <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; }
/// <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; }
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; } } } }
/// <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(); } }
/// <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; }
/// <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(); } } }