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; }