Exemple #1
0
        /// <summary>
        /// 尝试发送数据
        /// </summary>
        /// <param name="socket"></param>
        /// <param name="ioEventArgs"></param>
        private void DequeueAndPostSend(GSSocket socket, SocketAsyncEventArgs ioEventArgs)
        {
            try
            {
                byte[] data;
                if (socket.Dequeue(out data))           //获取发送队列中的数据
                {
                    if (ioEventArgs == null)
                    {
                        ioEventArgs = ioEventArgsPool.Pop();
                        ioEventArgs.AcceptSocket = socket.WorkSocket;
                    }

                    DataToken dataToken = (DataToken)ioEventArgs.UserToken;
                    dataToken.Socket        = socket;
                    dataToken.data          = data;
                    dataToken.dataBytesDone = 0;
                    //投递发送
                    PostSend(ioEventArgs);
                }
                else
                {
                    //发送结束
                    ReleaseIOEventArgs(ioEventArgs);
                    socket.ResetSendFlag();
                }
            }
            catch (Exception ex)
            {
                socket.ResetSendFlag();
                Console.WriteLine(ex.ToString());
            }
        }
Exemple #2
0
        /// <summary>
        /// 处理接收
        /// </summary>
        /// <param name="ioEventArgs"></param>
        private void ProcessReceive(SocketAsyncEventArgs ioEventArgs)
        {
            DataToken dataToken = (DataToken)ioEventArgs.UserToken;

            if (ioEventArgs.BytesTransferred == 0)
            {
                //客户端主动关闭连接
                Closing(ioEventArgs);
                return;
            }

            if (ioEventArgs.SocketError != SocketError.Success)
            {
                //Socket错误
                Closing(ioEventArgs);
                return;
            }

            GSSocket gsSocket = dataToken == null ? null : dataToken.Socket;

            byte[] buffer = new byte[ioEventArgs.BytesTransferred];
            Buffer.BlockCopy(ioEventArgs.Buffer, dataToken.bufferOffset, buffer, 0, buffer.Length);

            PostReceive(ioEventArgs);
        }
Exemple #3
0
        /// <summary>
        /// 处理Accept
        /// </summary>
        /// <param name="acceptEventArgs"></param>
        private void ProcessAccept(SocketAsyncEventArgs acceptEventArgs)
        {
            try
            {
                maxConnectionsEnforcer.WaitOne();
                if (acceptEventArgs.SocketError != SocketError.Success)
                {
                    HandleBadAccept(acceptEventArgs);
                }
                else
                {
                    //投递接收事件
                    SocketAsyncEventArgs ioEventArgs = ioEventArgsPool.Pop();
                    ioEventArgs.AcceptSocket = acceptEventArgs.AcceptSocket;
                    DataToken dataToken = (DataToken)ioEventArgs.UserToken;
                    ioEventArgs.SetBuffer(dataToken.bufferOffset, socketSettings.BufferSize);
                    GSSocket gsSocket = new GSSocket(ioEventArgs.AcceptSocket);
                    dataToken.Socket             = gsSocket;
                    acceptEventArgs.AcceptSocket = null;
                    PostReceive(ioEventArgs);

                    //释放acceptArgs
                    ReleaseAccept(acceptEventArgs, false);
                }
            }
            finally
            {
                //投递下一个Accept事件
                PostAccept();
            }
        }
Exemple #4
0
 /// <summary>
 /// 异步发送
 /// </summary>
 /// <param name="socket"></param>
 /// <param name="data"></param>
 /// <returns></returns>
 public async Task <bool> SendAsync(GSSocket socket, byte[] data)
 {
     socket.Enqueue(data);
     return(await Task.Run(() =>
     {
         if (socket.TrySetSendFlag())
         {
             DequeueAndPostSend(socket, null);
             return true;
         }
         return false;
     }));
 }
Exemple #5
0
        /// <summary>
        /// 尝试发送数据
        /// </summary>
        /// <param name="socket"></param>
        /// <param name="ioEventArgs"></param>
        private void DequeueAndPostSend(GSSocket socket, SocketAsyncEventArgs ioEventArgs)
        {
            try
            {
                byte[] data;
                if (socket.Dequeue(out data))           //获取发送队列中的数据
                {
                    if (ioEventArgs == null)
                    {
                        ioEventArgs = ioEventArgsPool.Pop();
                        ioEventArgs.AcceptSocket = socket.WorkSocket;
                    }

                    DataToken dataToken = (DataToken)ioEventArgs.UserToken;
                    dataToken.Socket = socket;
                    dataToken.data = data;
                    dataToken.dataBytesDone = 0;
                    //投递发送
                    PostSend(ioEventArgs);
                }
                else
                {
                    //发送结束
                    ReleaseIOEventArgs(ioEventArgs);
                    socket.ResetSendFlag();
                }
            }
            catch (Exception ex)
            {
                socket.ResetSendFlag();
                Console.WriteLine(ex.ToString());
            }
        }
Exemple #6
0
 /// <summary>
 /// 异步发送
 /// </summary>
 /// <param name="socket"></param>
 /// <param name="data"></param>
 /// <returns></returns>
 public async Task<bool> SendAsync(GSSocket socket, byte[] data)
 {
     socket.Enqueue(data);
     return await Task.Run(() =>
         {
             if (socket.TrySetSendFlag())
             {
                 DequeueAndPostSend(socket, null);
                 return true;
             }
             return false;
         });
 }
Exemple #7
0
        /// <summary>
        /// 处理Accept
        /// </summary>
        /// <param name="acceptEventArgs"></param>
        private void ProcessAccept(SocketAsyncEventArgs acceptEventArgs)
        {
            try
            {
                maxConnectionsEnforcer.WaitOne(); 
                if (acceptEventArgs.SocketError != SocketError.Success)
                {
                    HandleBadAccept(acceptEventArgs);
                }
                else
                {
                    //投递接收事件
                    SocketAsyncEventArgs ioEventArgs = ioEventArgsPool.Pop(); 
                    ioEventArgs.AcceptSocket = acceptEventArgs.AcceptSocket;
                    DataToken dataToken = (DataToken)ioEventArgs.UserToken;
                    ioEventArgs.SetBuffer(dataToken.bufferOffset, socketSettings.BufferSize);
                    GSSocket gsSocket = new GSSocket(ioEventArgs.AcceptSocket);
                    dataToken.Socket = gsSocket;
                    acceptEventArgs.AcceptSocket = null;
                    PostReceive(ioEventArgs);

                    //释放acceptArgs
                    ReleaseAccept(acceptEventArgs, false);
                }
            }
            finally
            {
                //投递下一个Accept事件
                PostAccept();
            }
        }