コード例 #1
0
 private int getPort(ClientId clientId, string host)
 {
     if (ticks == clientId.Tick && host != null)
     {
         IPAddress ip = HostPort.HostToIPAddress(host);
         if (ip != null)
         {
             HashString ipHash    = ip.ToString();
             object     arrayLock = clientPool.ArrayLock;
             Ports      ports;
             Monitor.Enter(arrayLock);
             if (clientPool.Array[clientId.Index].Identity == clientId.Identity)
             {
                 try
                 {
                     if (!ipPorts.TryGetValue(ipHash, out ports))
                     {
                         ipPorts.Add(ipHash, ports = new Ports(config));
                     }
                     return(ports.Next);
                 }
                 finally { Monitor.Exit(arrayLock); }
             }
             Monitor.Exit(arrayLock);
         }
     }
     return(0);
 }
コード例 #2
0
        /// <summary>
        /// TCP 服务客户端创建器
        /// </summary>
        /// <param name="commandClient">TCP 服务客户端</param>
        internal ClientSocketCreator(ClientBase commandClient)
        {
            this.CommandClient = commandClient;
            Host = Attribute.Host;
            Port = Attribute.Port;

            IpAddress = HostPort.HostToIPAddress(this.Host, CommandClient.Log);
        }
コード例 #3
0
ファイル: Client.cs プロジェクト: zhangzheng1205/AutoCSer
        /// <summary>
        /// TCP 服务客户端
        /// </summary>
        /// <param name="host">监听主机名称</param>
        /// <param name="port">监听端口</param>
        /// <param name="serviceName">服务名称</param>
        /// <param name="sendBufferMaxSize">发送数据缓存区最大字节大小</param>
        /// <param name="minCompressSize">压缩启用最低字节数量</param>
        /// <param name="log">日志接口</param>
        /// <param name="maxInputSize">最大输入数据字节数</param>
        internal Client(string host, int port, string serviceName, int sendBufferMaxSize, int minCompressSize, ILog log, int maxInputSize) : base(serviceName, sendBufferMaxSize, minCompressSize, log)
        {
            this.Host = host;
            this.Port = port;
            IpAddress = HostPort.HostToIPAddress(this.Host, Log);

            this.maxInputSize = maxInputSize <= 0 ? int.MaxValue : maxInputSize;
            outputStream      = (outputSerializer = BinarySerialize.Serializer.YieldPool.Default.Pop() ?? new BinarySerialize.Serializer()).SetTcpServer();
        }
コード例 #4
0
ファイル: ServerBase.cs プロジェクト: AutoCSer/AutoCSer
        /// <summary>
        /// TCP 服务客户端
        /// </summary>
        /// <param name="attribute">TCP服务调用配置</param>
        /// <param name="verify">获取客户端请求线程调用类型</param>
        /// <param name="extendCommandBits">扩展服务命令二进制位数</param>
        /// <param name="log">日志接口</param>
        /// <param name="callQueueCount">独占的 TCP 服务器端同步调用队列数量</param>
        /// <param name="isCallQueueLink">是否提供独占的 TCP 服务器端同步调用队列(低优先级)</param>
        /// <param name="isSynchronousVerifyMethod">验证函数是否同步调用</param>
        internal ServerBase(ServerBaseAttribute attribute, Func <System.Net.Sockets.Socket, bool> verify, byte extendCommandBits, ILog log, int callQueueCount, bool isCallQueueLink, bool isSynchronousVerifyMethod)
            : base(attribute, attribute.GetReceiveBufferSize, attribute.GetSendBufferSize, attribute.GetServerSendBufferMaxSize, log)
        {
#if !NOJIT
            if (extendCommandBits == 0)
            {
                extendServerSet = ExtendServerSet.Null;
            }
            else if (extendCommandBits < 9 || extendCommandBits > 16)
            {
                throw new IndexOutOfRangeException("扩展服务命令二进制位数 " + extendCommandBits.toString() + " 超出范围 9-16");
            }
            else
            {
                extendServerSet = new ExtendServerSet(this, extendCommandBits);
            }
#endif
            this.verify = verify;
            if (callQueueCount > 0)
            {
                if (callQueueCount == 1)
                {
                    CallQueue = new ServerCallCanDisposableQueue(true, Log);
                    if (isCallQueueLink)
                    {
                        CallQueueLink = CallQueue.CreateLink();
                    }
                }
                else
                {
                    CallQueueArray = new KeyValue <ServerCallCanDisposableQueue, Threading.TaskQueueThread <ServerCallBase> .LowPriorityLink> [Math.Min(callQueueCount, 256)];
                    if (isCallQueueLink)
                    {
                        for (int index = 0; index != CallQueueArray.Length; ++index)
                        {
                            ServerCallCanDisposableQueue callQueue = new ServerCallCanDisposableQueue(true, Log);
                            CallQueueArray[index].Set(callQueue, callQueue.CreateLink());
                        }
                        CallQueueLink = CallQueueArray[0].Value;
                    }
                    else
                    {
                        for (int index = 0; index != CallQueueArray.Length; ++index)
                        {
                            CallQueueArray[index].Key = new ServerCallCanDisposableQueue(true, Log);
                        }
                    }
                    CallQueue = CallQueueArray[0].Key;
                }
            }
            ServerAttribute.Set(attribute);
            Port      = attribute.Port;
            IpAddress = HostPort.HostToIPAddress(attribute.Host, Log);
            int binaryDeSerializeMaxArraySize = attribute.GetBinaryDeSerializeMaxArraySize;
            BinaryDeSerializeConfig = AutoCSer.Net.TcpOpenServer.ServerAttribute.GetBinaryDeSerializeConfig(binaryDeSerializeMaxArraySize <= 0 ? AutoCSer.BinaryDeSerializer.DefaultConfig.MaxArraySize : binaryDeSerializeMaxArraySize);
            VerifyMethodCount       = isSynchronousVerifyMethod ? Server.DefaultVerifyMethodCount : (byte)(Server.DefaultVerifyMethodCount + 1);
        }
コード例 #5
0
 /// <summary>
 /// TCP 服务客户端
 /// </summary>
 /// <param name="attribute">TCP服务调用配置</param>
 /// <param name="verify">获取客户端请求线程调用类型</param>
 /// <param name="log">日志接口</param>
 /// <param name="isCallQueue">是否提供独占的 TCP 服务器端同步调用队列</param>
 internal ServerBase(attributeType attribute, Func <System.Net.Sockets.Socket, bool> verify, ILog log, bool isCallQueue)
     : base(attribute, attribute.GetReceiveBufferSize, attribute.GetSendBufferSize, attribute.GetServerSendBufferMaxSize, log)
 {
     this.verify = verify;
     if (isCallQueue)
     {
         CallQueue = new ServerCallCanDisposableQueue();
     }
     Port      = attribute.Port;
     IpAddress = HostPort.HostToIPAddress(attribute.Host, Log);
 }
コード例 #6
0
        /// <summary>
        /// 主机名称转换成IP地址
        /// </summary>
        /// <returns>是否转换成功</returns>
        public bool HostToIpAddress()
        {
            IPAddress ipAddress = HostPort.HostToIPAddress(Host);

            if (ipAddress == null)
            {
                return(false);
            }
            Host = ipAddress.ToString();
            return(true);
        }
コード例 #7
0
        /// <summary>
        /// TCP 服务客户端
        /// </summary>
        /// <param name="attribute">TCP服务调用配置</param>
        /// <param name="verify">获取客户端请求线程调用类型</param>
        /// <param name="log">日志接口</param>
        /// <param name="isCallQueue">是否提供独占的 TCP 服务器端同步调用队列</param>
        internal ServerBase(attributeType attribute, Func <System.Net.Sockets.Socket, bool> verify, ILog log, bool isCallQueue)
            : base(attribute, attribute.GetReceiveBufferSize, attribute.GetSendBufferSize, attribute.GetServerSendBufferMaxSize, log)
        {
            this.verify = verify;
            if (isCallQueue)
            {
                CallQueue = new ServerCallCanDisposableQueue();
            }
            Port      = attribute.Port;
            IpAddress = HostPort.HostToIPAddress(attribute.Host, Log);
            int binaryDeSerializeMaxArraySize = attribute.GetBinaryDeSerializeMaxArraySize;

            BinaryDeSerializeConfig = AutoCSer.Net.TcpOpenServer.ServerAttribute.GetBinaryDeSerializeConfig(binaryDeSerializeMaxArraySize <= 0 ? AutoCSer.BinarySerialize.DeSerializer.DefaultConfig.MaxArraySize : binaryDeSerializeMaxArraySize);
        }
コード例 #8
0
        /// <summary>
        /// 服务更新
        /// </summary>
        /// <param name="serverSet"></param>
        internal void OnServerChange(TcpRegister.ServerSet serverSet)
        {
            TcpRegister.ServerLog server    = serverSet.Server;
            IPAddress             ipAddress = HostPort.HostToIPAddress(server.Host, CommandClient.Log);

            if (server.Port == Port && ipAddress.Equals(IpAddress))
            {
                TryCreateSocket();
            }
            else
            {
                Host = server.Host;
                createSocket(IpAddress = ipAddress, Port = server.Port, Interlocked.Increment(ref CreateVersion));
            }
        }
コード例 #9
0
 /// <summary>
 /// 服务更新
 /// </summary>
 /// <param name="serverSet"></param>
 void TcpRegister.IClient.OnServerChange(TcpRegister.ServerSet serverSet)
 {
     if (serverSet != null)
     {
         TcpRegister.ServerLog server    = serverSet.Server;
         IPAddress             ipAddress = HostPort.HostToIPAddress(server.Host, Log);
         if (server.Port != Port || !ipAddress.Equals(IpAddress))
         {
             Host      = server.Host;
             IpAddress = ipAddress;
             Port      = server.Port;
         }
         createSocket();
     }
 }
コード例 #10
0
        /// <summary>
        /// TCP 服务客户端
        /// </summary>
        /// <param name="attribute">TCP服务调用配置</param>
        /// <param name="verify">获取客户端请求线程调用类型</param>
        /// <param name="log">日志接口</param>
        /// <param name="callQueueCount">独占的 TCP 服务器端同步调用队列数量</param>
        /// <param name="isCallQueueLink">是否提供独占的 TCP 服务器端同步调用队列(低优先级)</param>
        /// <param name="isSynchronousVerifyMethod">验证函数是否同步调用</param>
        internal ServerBase(ServerBaseAttribute attribute, Func <System.Net.Sockets.Socket, bool> verify, ILog log, int callQueueCount, bool isCallQueueLink, bool isSynchronousVerifyMethod)
            : base(attribute, attribute.GetReceiveBufferSize, attribute.GetSendBufferSize, attribute.GetServerSendBufferMaxSize, log)
        {
            this.verify = verify;
            if (callQueueCount > 0)
            {
                if (callQueueCount == 1)
                {
                    CallQueue = new ServerCallCanDisposableQueue(true, Log);
                    if (isCallQueueLink)
                    {
                        CallQueueLink = CallQueue.CreateLink();
                    }
                }
                else
                {
                    CallQueueArray = new KeyValue <ServerCallCanDisposableQueue, Threading.QueueTaskLinkThread <ServerCallBase> .LowPriorityLink> [Math.Min(callQueueCount, 256)];
                    if (isCallQueueLink)
                    {
                        for (int index = 0; index != CallQueueArray.Length; ++index)
                        {
                            ServerCallCanDisposableQueue callQueue = new ServerCallCanDisposableQueue(true, Log);
                            CallQueueArray[index].Set(callQueue, callQueue.CreateLink());
                        }
                        CallQueueLink = CallQueueArray[0].Value;
                    }
                    else
                    {
                        for (int index = 0; index != CallQueueArray.Length; ++index)
                        {
                            CallQueueArray[index].Key = new ServerCallCanDisposableQueue(true, Log);
                        }
                    }
                    CallQueue = CallQueueArray[0].Key;
                }
            }
            ServerAttribute.Set(attribute);
            Port      = attribute.Port;
            IpAddress = HostPort.HostToIPAddress(attribute.Host, Log);
            int binaryDeSerializeMaxArraySize = attribute.GetBinaryDeSerializeMaxArraySize;

            BinaryDeSerializeConfig = AutoCSer.Net.TcpOpenServer.ServerAttribute.GetBinaryDeSerializeConfig(binaryDeSerializeMaxArraySize <= 0 ? AutoCSer.BinarySerialize.DeSerializer.DefaultConfig.MaxArraySize : binaryDeSerializeMaxArraySize);
            VerifyMethodCount       = isSynchronousVerifyMethod ? Server.DefaultVerifyMethodCount : (byte)(Server.DefaultVerifyMethodCount + 1);
        }
コード例 #11
0
        /// <summary>
        /// TCP 服务客户端
        /// </summary>
        /// <param name="attribute">TCP服务调用配置</param>
        /// <param name="log">日志接口</param>
        /// <param name="maxInputSize">最大输入数据字节数</param>
        internal Client(TcpServer.ServerBaseAttribute attribute, ILog log, int maxInputSize)
            : base(attribute, attribute.ClientSendBufferMaxSize, log)
        {
            this.Host = attribute.Host;
            this.Port = attribute.Port;
            IpAddress = HostPort.HostToIPAddress(this.Host, Log);

            this.maxInputSize = maxInputSize <= 0 ? int.MaxValue : maxInputSize;
            outputStream      = (outputSerializer = BinarySerializer.YieldPool.Default.Pop() ?? new BinarySerializer()).SetTcpServer();

            SubBuffer.Pool.GetPool(attribute.GetSendBufferSize).Get(ref Buffer);
            if (attribute.IsRemoteExpression)
            {
                remoteExpressionServerNodeIdChecker = new RemoteExpressionServerNodeIdChecker {
                    Client = this
                }
            }
            ;
        }
コード例 #12
0
 /// <summary>
 /// 启动服务
 /// </summary>
 protected void start()
 {
     try
     {
         IPAddress ipAddress = HostPort.HostToIPAddress(host.Host, RegisterServer.TcpServer.Log);
         socket = new System.Net.Sockets.Socket(ipAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
         socket.Bind(new IPEndPoint(ipAddress, host.Port));
         socket.Listen(int.MaxValue);
         socketHandle.Set(0);
         AutoCSer.Threading.ThreadPool.TinyBackground.FastStart(GetSocket);
         if (host.Port == 0)
         {
             RegisterServer.TcpServer.Log.Add(AutoCSer.Log.LogType.Warn, "HTTP 服务端口为 0");
         }
     }
     catch (Exception error)
     {
         Dispose();
         RegisterServer.TcpServer.Log.Add(AutoCSer.Log.LogType.Error, error, "HTTP 服务器端口 " + host.Host + ":" + host.Port.toString() + " TCP连接失败)");
     }
 }
コード例 #13
0
 /// <summary>
 /// 服务更新
 /// </summary>
 /// <param name="serverSet"></param>
 void TcpRegister.IClient.OnServerChange(TcpRegister.ServerSet serverSet)
 {
     if (serverSet != null)
     {
         TcpRegister.ServerInfo server = serverSet.Server.Server;
         IPAddress ipAddress           = HostPort.HostToIPAddress(server.Host, Log);
         if (server.Port == Port && ipAddress.Equals(IpAddress))
         {
             if (!server.IsCheckRegister)
             {
                 createSocket();
             }
         }
         else
         {
             Host      = server.Host;
             IpAddress = ipAddress;
             Port      = server.Port;
             createSocket();
         }
     }
 }
コード例 #14
0
ファイル: Client.cs プロジェクト: zlzforever/AutoCSer
 /// <summary>
 /// 服务更新
 /// </summary>
 /// <param name="serverSet"></param>
 void TcpRegister.IClient.OnServerChange(TcpRegister.ServerSet serverSet)
 {
     if (serverSet == null)
     {
         SocketWait.PulseReset();
     }
     else
     {
         TcpRegister.ServerInfo server = serverSet.Server.Server;
         IPAddress ipAddress           = HostPort.HostToIPAddress(server.Host, Log);
         if (server.Port == Port && ipAddress.Equals(IpAddress))
         {
             if (!server.IsCheckRegister)
             {
                 TryCreateSocket();
             }
         }
         else
         {
             Host = server.Host;
             createSocket(IpAddress = ipAddress, Port = server.Port, Interlocked.Increment(ref CreateVersion));
         }
     }
 }