/// <summary>
 ///     添加TCP调用服务端
 /// </summary>
 /// <param name="socket">TCP调用套接字</param>
 /// <param name="data">参数序列化数据</param>
 private void newServer(TmphSocket socket, TmphSubArray<byte> data)
 {
     try
     {
         var host = new TmphHost();
         if (TmphDataDeSerializer.DeSerialize(data, ref host))
         {
             TmphThreadPool.TinyPool.FastStart(server.newServerHandle,
                 new TmphServerInfo { Socket = socket, Identity = socket.Identity, Host = host }, null, null);
             return;
         }
     }
     catch (Exception error)
     {
         TmphLog.Error.Add(error, null, true);
     }
     socket.SendStream(socket.Identity, new TmphAsynchronousMethod.TmphReturnValue { IsReturn = false });
 }
 /// <summary>
 ///     移除TCP调用服务端
 /// </summary>
 /// <param name="socket">TCP调用套接字</param>
 /// <param name="data">参数序列化数据</param>
 private void removeServer(TmphSocket socket, TmphSubArray<byte> data)
 {
     try
     {
         var host = new TmphHost();
         if (TmphDataDeSerializer.DeSerialize(data, ref host))
         {
             socket.SendStream(socket.Identity,
                 new TmphAsynchronousMethod.TmphReturnValue<bool>
                 {
                     IsReturn = true,
                     Value = server.removeServer(host)
                 });
             return;
         }
     }
     catch (Exception error)
     {
         TmphLog.Error.Add(error, null, true);
     }
     socket.SendStream(socket.Identity, new TmphAsynchronousMethod.TmphReturnValue { IsReturn = false });
 }
 /// <summary>
 ///     添加TCP调用服务端
 /// </summary>
 /// <param name="host">TCP调用服务端端口信息</param>
 /// <param name="onReturn">创建完成回调处理</param>
 public void NewServer(TmphHost host, Action<bool> onReturn)
 {
     try
     {
         TmphClient.StreamSocket.Get(
             onReturn == null
                 ? null
                 : (Action<TmphAsynchronousMethod.TmphReturnValue<bool>>)
                     new TmphServerReturn { OnReturn = onReturn }.OnNewServer, NewServerCommandIndex, host, 1024,
             false, true, false);
         return;
     }
     catch (Exception error)
     {
         TmphLog.Error.Add(error, null, false);
     }
     if (onReturn != null) onReturn(false);
 }
 /// <summary>
 ///     移除TCP调用服务端
 /// </summary>
 /// <param name="host">TCP调用服务端端口信息</param>
 /// <returns>是否移除成功</returns>
 public bool RemoveServer(TmphHost host)
 {
     var wait = getWait(false);
     if (wait.Value != null)
     {
         try
         {
             wait.Key.Get(wait.Value.OnReturn, RemoveServerCommandIndex, host, 1024, false, false, false);
             var value = wait.Value.Value;
             return value.IsReturn && value.Value;
         }
         catch (Exception error)
         {
             TmphLog.Error.Add(error, null, false);
         }
     }
     return false;
 }
 /// <summary>
 ///     重置TCP调用客户端
 /// </summary>
 /// <param name="host">TCP调用端口信息</param>
 /// <param name="TmphClient">TCP调用客户端</param>
 /// <returns>TCP调用客户端+未完成处理数量</returns>
 internal TmphKeyValue<TClientType, int> ReSet(TmphHost host, TClientType TmphClient)
 {
     if (Client.Client != null && Host.Equals(host))
     {
         var removeClient = Client.Client;
         var count = Count;
         Client.Set(TmphClient);
         Count = 0;
         return new TmphKeyValue<TClientType, int>(removeClient, count);
     }
     return default(TmphKeyValue<TClientType, int>);
 }
 /// <summary>
 ///     移除TCP调用客户端
 /// </summary>
 /// <param name="host">TCP调用端口信息</param>
 /// <returns>TCP调用客户端+未完成处理数量</returns>
 internal TmphKeyValue<TClientType, int> Remove(TmphHost host)
 {
     if (Client.Client != null && Host.Equals(host)) return Remove();
     return default(TmphKeyValue<TClientType, int>);
 }
 /// <summary>
 ///     设置TCP调用客户端
 /// </summary>
 /// <param name="host">TCP调用端口信息</param>
 /// <param name="TmphClient">TCP调用客户端</param>
 /// <param name="index">TCP调用客户端索引</param>
 internal void Set(TmphHost host, TClientType TmphClient, int index)
 {
     Client.Set(TmphClient, index);
     Host = host;
     Count = 0;
 }
 /// <summary>
 ///     重置TCP调用客户端
 /// </summary>
 /// <param name="host">TCP调用端口信息</param>
 /// <param name="TmphClient">TCP调用客户端</param>
 internal void Set(TmphHost host, TClientType TmphClient)
 {
     Client.Client = TmphClient;
     Host = host;
     Count = 0;
 }
 private bool setForward(TmphHost host)
 {
     if (isDisposed == 0 && host.HostToIpAddress())
     {
         var tcpServer = new Code.CSharp.TmphTcpServer { Host = host.Host, Port = host.Port };
         if (tcpServer.IpAddress != IPAddress.Any)
         {
             forwardHost = tcpServer;
             return true;
         }
     }
     return false;
 }
 ///// <summary>
 ///// 停止域名服务
 ///// </summary>
 ///// <param name="domainServer">域名服务</param>
 //private unsafe void stop(domainServer domainServer)
 //{
 //    if (domainServer != null && domainServer.Domains != null)
 //    {
 //        try
 //        {
 //            for (int index = domainServer.Domains.Length; index != 0; )
 //            {
 //                if (Interlocked.CompareExchange(ref domainServer.Domains[--index].Value, 1, 0) == 0)
 //                {
 //                    stop(domainServer.Domains[index].Key);
 //                    Interlocked.Decrement(ref domainServer.DomainCount);
 //                }
 //            }
 //        }
 //        catch (Exception error)
 //        {
 //            log.Default.Add(error, null, false);
 //        }
 //        finally
 //        {
 //            domainServer.Dispose();
 //        }
 //    }
 //}
 /// <summary>
 ///     停止TCP服务
 /// </summary>
 /// <param name="host">TCP服务端口信息</param>
 private void stop(TmphHost host)
 {
     TmphServer server;
     Monitor.Enter(hostLock);
     try
     {
         if (hosts.TryGetValue(host, out server))
         {
             if (--server.DomainCount == 0) hosts.Remove(host);
             else server = null;
         }
     }
     finally
     {
         Monitor.Exit(hostLock);
     }
     if (server != null) server.Dispose();
 }
 /// <summary>
 ///     启动TCP服务
 /// </summary>
 /// <param name="host">TCP服务端口信息</param>
 /// <param name="certificateFileName">安全证书文件</param>
 /// <returns>HTTP服务启动状态</returns>
 private TmphStartState start(TmphHost host, string certificateFileName)
 {
     var state = TmphStartState.TcpError;
     TmphServer server = null;
     Monitor.Enter(hostLock);
     try
     {
         if (hosts.TryGetValue(host, out server))
         {
             if (server.CheckCertificate(certificateFileName))
             {
                 ++server.DomainCount;
                 return TmphStartState.Success;
             }
             server = null;
             state = TmphStartState.CertificateMatchError;
         }
         else
         {
             state = TmphStartState.CertificateError;
             server = certificateFileName == null
                 ? new TmphServer(this, host)
                 : new TmphSslServer(this, host, certificateFileName);
             state = TmphStartState.TcpError;
             if (server.Start())
             {
                 hosts.Add(host, server);
                 return TmphStartState.Success;
             }
         }
     }
     catch (Exception error)
     {
         TmphLog.Error.Add(error, null, false);
     }
     finally
     {
         Monitor.Exit(hostLock);
     }
     TmphPub.Dispose(ref server);
     return state;
 }
 /// <summary>
 ///     HTTP服务
 /// </summary>
 /// <param name="servers">HTTP服务器</param>
 /// <param name="host">TCP服务端口信息</param>
 /// <param name="certificateFileName">安全证书文件</param>
 public TmphSslServer(TmphServers servers, TmphHost host, string certificateFileName)
     : base(servers, host)
 {
     certificateFileData = File.ReadAllBytes(certificateFileName);
     certificate = X509Certificate.CreateFromCertFile(certificateFileName);
 }
 /// <summary>
 ///     HTTP服务
 /// </summary>
 /// <param name="servers">HTTP服务器</param>
 /// <param name="host">TCP服务端口信息</param>
 public TmphServer(TmphServers servers, TmphHost host)
     : base(new TmphTcpServer { Host = host.Host, Port = host.Port, IsServer = true })
 {
     this.servers = servers;
     DomainCount = 1;
 }