Beispiel #1
0
        private void Form1_Load(object sender, EventArgs e)
        {
            // 演示设置serer属性

            // 缓冲区大小应根据实际业务设置, 并发数和包大小都是考虑条件
            // 都是小包的情况下4K合适, 刚好是一个内存分页(在非托管内存, 相关知识查百度)
            // 大包比较多的情况下, 应根据并发数设置比较大但是又不会爆内存的值
            _server.SocketBufferSize = 4096; // 4K

            // serer绑定地址和端口
            _server.Address = "0.0.0.0";
            _server.Port    = 5555;

            // 演示绑定事件
            _server.OnPrepareListen += OnPrepareListen;
            _server.OnAccept        += OnAccept;
            _server.OnReceive       += OnReceive;
            _server.OnClose         += OnClose;
            _server.OnShutdown      += OnShutdown;


            // 线程池相关设置
            // 线程池回调函数
            _taskTaskProc = TaskTaskProc;

            // 定时输出线程池任务数
            _timer.Elapsed += (_, args) =>
            {
                if (_server.HasStarted && _threadPool.HasStarted)
                {
                    AddLog($"线程池当前在执行的任务数: {_threadPool.TaskCount}, 任务队列数: {_threadPool.QueueSize}");
                }
            };
            _timer.Start();
        }
Beispiel #2
0
        private void Form1_Load(object sender, EventArgs e)
        {
            // 演示设置serer属性

            // 缓冲区大小应根据实际业务设置, 并发数和包大小都是考虑条件
            // 都是小包的情况下4K合适, 刚好是一个内存分页(在非托管内存, 相关知识查百度)
            // 大包比较多的情况下, 应根据并发数设置比较大但是又不会爆内存的值
            _server.SocketBufferSize = 4096; // 4K

            // serer绑定地址和端口
            _server.Address = "0.0.0.0";
            _server.Port    = 5555;

            // ssl 证书加载
            // ReSharper disable once BitwiseOperatorOnEnumWithoutFlags
            _server.VerifyMode = SslVerifyMode.Peer | SslVerifyMode.FailIfNoPeerCert;
            // 单向验证或客户端可选
            _server.CaPemCertFileOrPath = "ssl-cert\\ca.crt";
            _server.PemCertFile         = "ssl-cert\\server.cer";
            _server.PemKeyFile          = "ssl-cert\\server.key";
            _server.KeyPassword         = "******";

            // 初始化ssl环境, 参数false表示从文件加载证书, 如果为true, 应该把证书读到内存
            // 例如, 证书是数据库里读入进来的文本数据, 此处为true
            if (!_server.Initialize(false))
            {
                AddLog("ssl环境初始化失败, 请检查证书是否存在, 证书密码是否正确");
                return;
            }


            // 演示绑定事件
            _server.OnPrepareListen += OnPrepareListen;
            _server.OnAccept        += OnAccept;
            // ssl server 还应该绑定握手事件, 该事件到达说明两端握手成功, OnAccept只能说明连接进入了, 还没握手
            _server.OnHandShake += OnHandShake;
            _server.OnReceive   += OnReceive;
            _server.OnClose     += OnClose;
            _server.OnShutdown  += OnShutdown;


            // 线程池相关设置
            // 线程池回调函数
            _taskTaskProc = TaskTaskProc;

            // 定时输出线程池任务数
            _timer.Elapsed += (_, args) =>
            {
                if (_server.HasStarted && _threadPool.HasStarted)
                {
                    AddLog($"线程池当前在执行的任务数: {_threadPool.TaskCount}, 任务队列数: {_threadPool.QueueSize}");
                }
            };
            _timer.Start();
        }
Beispiel #3
0
        ///// <summary>
        ///// 向线程池提交异步任务
        ///// </summary>
        ///// <param name="taskProc">任务处理函数</param>
        ///// <param name="args">任务参数</param>
        ///// <param name="maxWait">最大等待时间(毫秒,默认:INFINITE即-1,一直等待)</param>
        ///// <returns>true: 成功, false: 失败,可通过 ErrorCode 属性 获取系统错误代码,其中,错误码 ERROR_DESTINATION_ELEMENT_FULL 表示任务队列已满</returns>
        //public bool Submit(TaskProc taskProc, IntPtr args, int maxWait = -1) => Sdk.ThreadPool.HP_ThreadPool_Submit(_pool, taskProc, args, maxWait);

        /// <summary>
        /// 向线程池提交异步任务
        /// </summary>
        /// <param name="taskProc">任务处理函数</param>
        /// <param name="obj">任务参数</param>
        /// <param name="maxWait">最大等待时间(毫秒,默认:INFINITE即-1,一直等待)</param>
        /// <returns>true: 成功, false: 失败,可通过 ErrorCode 属性 获取系统错误代码,其中,错误码 ERROR_DESTINATION_ELEMENT_FULL 表示任务队列已满</returns>
        public bool Submit(TaskProcEx taskProc, object obj, int maxWait = -1)
        {
            var guid = Guid.NewGuid().ToString("N");
            var args = new ThreadProcExArgs
            {
                Arg      = obj,
                TaskProc = taskProc,
            };

            if (!_extraData.Set(guid, args))
            {
                return(false);
            }

            var bytes = Encoding.ASCII.GetBytes(guid);
            var gch   = GCHandle.Alloc(bytes, GCHandleType.Pinned);

            return(Sdk.ThreadPool.HP_ThreadPool_Submit(_pool, _taskProc, (IntPtr)gch, maxWait));
        }