Ejemplo n.º 1
0
        /// <summary>
        /// 异步的发送数据
        /// </summary>
        /// <param name="e"></param>
        /// <param name="data"></param>
        public static void Send(SocketAsyncEventArgs e, byte[] data)
        {
            AsyncUserToken userToken = e.UserToken as AsyncUserToken;

            if (userToken.SendEventArgs.SocketError == SocketError.Success)
            {
                if (userToken.ConnectSocket.Connected)
                {
                    //设置发送数据
                    e.SetBuffer(data, 0, data.Length);
                    //投递发送请求,这个函数有可能同步发送出去,这时返回false,并且不会引发SocketAsyncEventArgs.Completed事件
                    if (!userToken.ConnectSocket.SendAsync(userToken.SendEventArgs))
                    {
                        //同步发送时处理发送完成事件
                        ProcessSend(userToken.SendEventArgs);
                    }
                }
            }
        }
Ejemplo n.º 2
0
        /// <summary>
        /// 初始化基本设置信息
        /// </summary>
        private void Init(int maxConnectionCount)
        {
            _asyncReceive = new AsyncReceive(EventManager);
            _asyncAccept  = new AsyncAccept(_asyncReceive, EventManager);
            //初始化配置项
            ConfigData.MaxClientCount = maxConnectionCount;

            ConfigData.UserTokenPool      = new SocketAsyncEventArgsPool(ConfigData.MaxClientCount);
            ConfigData.MaxAcceptedClients = new System.Threading.Semaphore(ConfigData.MaxClientCount, ConfigData.MaxClientCount);
            //
            AsyncUserToken userToken;

            for (int i = 0; i < ConfigData.MaxClientCount; i++)
            {
                userToken = new AsyncUserToken(ConfigData.BufferSize);
                userToken.ReceiveEventArgs.Completed += new EventHandler <SocketAsyncEventArgs>(_asyncReceive.OnIOCompleted);
                userToken.SendEventArgs.Completed    += new EventHandler <SocketAsyncEventArgs>(AsyncSend.OnIOCompleted);
                ConfigData.UserTokenPool.Push(userToken);
            }
        }
Ejemplo n.º 3
0
        /// <summary>
        ///接收完成时处理函数
        /// </summary>
        /// <param name="e">与接收完成操作相关联的SocketAsyncEventArg对象</param>
        public void ProcessReceive(SocketAsyncEventArgs e)
        {
            AsyncUserToken userToken = e.UserToken as AsyncUserToken;

            if (userToken.ReceiveEventArgs.BytesTransferred > 0 && userToken.ReceiveEventArgs.SocketError == SocketError.Success)
            {
                Socket sock = userToken.ConnectSocket;
                //把收到的数据写入到缓存区里面
                userToken.ReceiveBuffer.WriteBuffer(e.Buffer, e.Offset, e.BytesTransferred);
                //调用消息处理事件
                _eventManager.OnReceive(userToken);
                Array.Clear(e.Buffer, 0, e.BytesTransferred);
                //为接收下一段数据,投递接收请求,这个函数有可能同步完成,这时返回false,并且不会引发SocketAsyncEventArgs.Completed事件
                if (!sock.ReceiveAsync(userToken.ReceiveEventArgs))
                {
                    //同步接收时处理接收完成事件
                    ProcessReceive(userToken.ReceiveEventArgs);
                }
            }
        }
Ejemplo n.º 4
0
 public void OnReceive(AsyncUserToken asyncUserToken)
 {
     Receive?.Invoke(asyncUserToken);
 }
Ejemplo n.º 5
0
 public void OnAccept(AsyncUserToken asyncUserToken, int currentClientCount)
 {
     Accept?.Invoke(asyncUserToken, currentClientCount);
 }