/// <summary>
        /// 异步发送
        /// </summary>
        /// <param name="userToken">AsyncUserToken</param>
        /// <param name="buffer">byte[]</param>
        /// <param name="offset">int</param>
        /// <param name="count">int</param>
        /// <returns>bool</returns>
        private ResMsg SendAsyncEvent(AsyncUserToken userToken, byte[] buffer, int offset, int count)
        {
            if (userToken.Socket == null || !userToken.Socket.Connected)
            {
                userToken.m_sendAsync = false;
                return(new ResMsg(false, "连接已关闭"));
            }
            userToken.SendEventArgs.SetBuffer(buffer, offset, count);                  //设置发送缓冲区域
            bool willRaiseEvent = userToken.Socket.SendAsync(userToken.SendEventArgs); //异步发送

            if (!willRaiseEvent)
            {
                return(ProcessSend(userToken.SendEventArgs));
            }
            //userToken.m_sendAsync = false;
            return(new ResMsg(true, ""));
        }
        /// <summary>
        /// 通过预先分配可重用缓冲区和上下文对象来初始化服务器。
        /// 这些对象不需要预先分配或重用,但是这样做是为了说明如何轻松地使用API创建可重用对象来提高服务器性能。
        /// </summary>
        private void Init()
        {
            if (_isInited)
            {
                return;
            }
            AsyncUserToken userToken;

            for (int i = 0; i < _maxConnections; i++) //按照连接数建立读写对象
            {
                userToken             = new AsyncUserToken(_recvBufferSize);
                userToken.AsyncServer = this;
                //异步回调函数初始化
                userToken.RecvEventArgs.Completed += new EventHandler <SocketAsyncEventArgs>(IO_Completed);
                userToken.SendEventArgs.Completed += new EventHandler <SocketAsyncEventArgs>(IO_Completed);
                //开辟固定空间
                m_asyncUserTokenPool.Push(userToken);
            }
            _isInited = true;
        }
Beispiel #3
0
        public void AsyncClose()
        {
            Thread th = new Thread(new ParameterizedThreadStart(state =>
            {
                AsyncUserToken userToken = state as AsyncUserToken;
                if (userToken != null)
                {
                    try
                    {
                        userToken.Close();
                    }
                    catch (Exception ex)
                    {
                        //LogHelper.LogError(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + " 关闭连接发生异常", ex);
                    }
                }
            }));

            th.IsBackground = true;
            th.Start(this);
        }
        /// <summary>
        /// 异步发送回调函数
        /// </summary>
        /// <param name="asyncEventArgs"></param>
        private ResMsg ProcessSend(SocketAsyncEventArgs sendEventArgs)
        {
            AsyncUserToken userToken = sendEventArgs.UserToken as AsyncUserToken;

            userToken.ActiveDateTime = DateTime.Now;
            if (sendEventArgs.SocketError == SocketError.Success)
            {
                //发送成功,检查缓存中是否还有数据没有发送,有就继续发送
                byte[] data;
                if (userToken.SendBuffer.TryDequeue(out data) && data != null)
                {
                    userToken.m_sendAsync = true;
                    return(SendAsyncEvent(userToken, data, 0, data.Length));
                }
                userToken.m_sendAsync = false;
                return(new ResMsg(true, ""));
            }
            else
            {
                userToken.AsyncClose();
                return(new ResMsg(false, "连接已关闭"));
            }
        }
 public ResMsg SendData(AsyncUserToken userToken, byte[] buffer, int offset, int count)
 {
     if (buffer == null || buffer.Length == 0 || count <= 1)
     {
         return(new ResMsg(false, "要发送的数据不能为空"));
     }
     if ((offset + count) > buffer.Length)
     {
         return(new ResMsg(false, "要发送的数据长度不足"));
     }
     if (userToken.Socket == null || !userToken.Socket.Connected)
     {
         return(new ResMsg(false, "连接已断开"));
     }
     byte[] data = new byte[count];
     Buffer.BlockCopy(buffer, 0, data, 0, count);
     userToken.SendBuffer.Enqueue(data);
     try
     {
         if (!userToken.m_sendAsync)
         {
             byte[] sendData;
             if (userToken.SendBuffer.TryDequeue(out sendData) && sendData != null)
             {
                 userToken.m_sendAsync = true;
                 return(SendAsyncEvent(userToken, sendData, 0, sendData.Length));
             }
         }
         return(new ResMsg(true, ""));
     }
     catch (Exception ex)
     {
         return(new ResMsg {
             Result = false, Message = ex.Message, RefObj = ex
         });
     }
 }
        /// <summary>
        /// 只要在套接字上完成了接收或发送操作,就会调用此方法
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e">与完成的接收操作相关联的SocketAsyncEventArg</param>
        private void IO_Completed(object sender, SocketAsyncEventArgs e)
        {
            AsyncUserToken userToken = e.UserToken as AsyncUserToken;

            try
            {
                //确定刚刚完成的操作类型并调用关联的处理程序
                if (e.LastOperation == SocketAsyncOperation.Receive)
                {
                    ProcessReceive(e);
                }
                else if (e.LastOperation == SocketAsyncOperation.Send)
                {
                    ProcessSend(e);
                }
                else
                {
                    throw new ArgumentException("在套接字上完成的最后一个操作不是接收或发送");
                }
            }
            catch (Exception ex)
            {
            }
        }
Beispiel #7
0
 public DataPacket(AsyncUserToken userToken, byte[] data)
 {
     _userToken = userToken;
     _data      = data;
 }