예제 #1
0
        /// <summary>
        /// 结束发送
        /// </summary>
        /// <param name="iar">异步结果</param>
        /// <returns>是否发送成功</returns>
        public bool EndSend(IAsyncResult iar)
        {
            SocketHandlerState state = null;

            lock (StateSet)
            {
                if (!StateSet.ContainsKey(iar))  //判断异步操作状态是否属于当前处理程序
                {
                    throw new ArgumentException("aysncresult not contain");
                }
                state = StateSet[iar];
                StateSet.Remove(iar);
            }

            return(state.Completed);
        }
예제 #2
0
        /// <summary>
        /// 异步读取结束
        /// </summary>
        /// <param name="iar">异步结果</param>
        private void EndRead(IAsyncResult iar)
        {
            SocketHandlerState state = (SocketHandlerState)iar.AsyncState;

            try
            {
                state.DataLength = state.Stream.EndRead(iar);
            }
            catch
            {
                state.DataLength = 0;
            }

            if (state.DataLength == 0)  //表示Socket断开连接
            {
                lock (StateSet)
                    StateSet.Add(state.AsyncResult, state);
                state.Data       = new byte[0];                            //设定接收的数据为空
                state.DataLength = 0;                                      //设定接收的数据长度为0
                ((AutoResetEvent)state.AsyncResult.AsyncWaitHandle).Set(); //允许等待线程继续
                state.AsyncCallBack(state.AsyncResult);                    //执行异步回调函数
                return;
            }

            if (state.Completed)  //如果已经完成状态,开始下次接收
            {
                lock (StateSet)
                    StateSet.Add(state.AsyncResult, state);
                ((AutoResetEvent)state.AsyncResult.AsyncWaitHandle).Set(); //允许等待线程继续
                state.AsyncCallBack(state.AsyncResult);                    //执行异步回调函数

                try
                {
                    state.Stream.BeginRead(state.Data, 0, 1024, EndRead, state); //继续接收数据
                }
                catch                                                            //出现Socket异常
                {
                    lock (StateSet)
                        StateSet.Add(state.AsyncResult, state);
                    state.Data       = new byte[0];                            //设定接收的数据为空
                    state.DataLength = 0;                                      //设定接收的数据长度为0
                    ((AutoResetEvent)state.AsyncResult.AsyncWaitHandle).Set(); //允许等待线程继续
                    state.AsyncCallBack(state.AsyncResult);                    //执行异步回调函数
                }
            }
        }
예제 #3
0
        /// <summary>
        /// 异步写入结束
        /// </summary>
        /// <param name="iar">异步结果</param>
        private void EndWrite(IAsyncResult iar)
        {
            SocketHandlerState state = (SocketHandlerState)iar.AsyncState;

            lock (StateSet)  //锁定StateSet
                StateSet.Add(state.AsyncResult, state);

            try
            {
                state.Stream.EndWrite(iar);
            }
            catch                                                          //出现Socket异常
            {
                state.Completed = false;                                   //发送失败
                ((AutoResetEvent)state.AsyncResult.AsyncWaitHandle).Set(); //允许等待线程继续
                state.AsyncCallBack(state.AsyncResult);                    //执行异步回调函数
                return;
            }

            state.Completed = true;                                    //发送成功
            ((AutoResetEvent)state.AsyncResult.AsyncWaitHandle).Set(); //允许等待线程继续
            state.AsyncCallBack(state.AsyncResult);                    //执行异步回调函数

            lock (SendQueue)                                           //锁定SendQueue
            {
                SocketHandlerState prepare = null;
                SendQueue.Remove(state);  //移除当前发送完成的数据
                if (SendQueue.Count > 0)  //如果SendQueue还有数据待发送,则继续发送
                {
                    prepare = SendQueue[0];
                }
                if (prepare != null)
                {
                    try
                    {
                        prepare.Stream.BeginWrite(prepare.Data, 0, prepare.Data.Length, EndWrite, prepare).AsyncWaitHandle.WaitOne();  //开始异步发送数据
                    }
                    catch
                    {
                        state.Completed = false;                                   //发送失败
                        ((AutoResetEvent)state.AsyncResult.AsyncWaitHandle).Set(); //允许等待线程继续
                        state.AsyncCallBack(state.AsyncResult);                    //执行异步回调函数
                    }
                }
            }
        }
예제 #4
0
        /// <summary>
        /// 开始接收
        /// </summary>
        /// <param name="stream">Socket网络流</param>
        /// <param name="callback">回调函数</param>
        /// <param name="state">自定义状态</param>
        /// <returns>异步结果</returns>
        public IAsyncResult BeginReceive(Stream stream, AsyncCallback callback, object state)
        {
            if (stream == null)
            {
                throw new ArgumentNullException("stream");
            }
            if (!stream.CanRead)
            {
                throw new ArgumentException("stream can not read");
            }
            if (callback == null)
            {
                throw new ArgumentNullException("callback");
            }

            SocketAsyncResult  result = new SocketAsyncResult(state);
            SocketHandlerState shs    = new SocketHandlerState(); //初始化SocketHandlerState

            shs.Data          = new byte[1024];
            shs.Stream        = stream;
            shs.Completed     = true;
            shs.AsyncResult   = result;
            shs.AsyncCallBack = callback;

            //开始异步接收数据,包含接收的数据长度
            try
            {
                stream.BeginRead(shs.Data, 0, 1024, EndRead, shs);
            }
            catch
            {
                result.CompletedSynchronously = true;
                shs.Data       = new byte[0];
                shs.DataLength = 0;
                shs.Completed  = false;
                lock (StateSet)
                    StateSet.Add(result, shs);
                ((AutoResetEvent)result.AsyncWaitHandle).WaitOne();
                callback(result);
            }

            return(result);
        }
예제 #5
0
        /// <summary>
        /// 结束接收
        /// </summary>
        /// <param name="iar">异步结果</param>
        /// <returns>接收的数据</returns>
        public byte[] EndReceive(IAsyncResult iar)
        {
            SocketHandlerState state = null;

            lock (StateSet)
            {
                if (!StateSet.ContainsKey(iar))  //判断异步操作状态是否属于当前处理程序
                {
                    throw new ArgumentException("aysncresult not contain");
                }
                state = StateSet[iar];
                StateSet.Remove(iar);

                byte[] recv = new byte[state.DataLength];
                Array.Copy(state.Data, recv, state.DataLength);

                return(recv);
            }
        }
예제 #6
0
        /// <summary>
        /// 开始发送
        /// </summary>
        /// <param name="data">发送的数据内容</param>
        /// <param name="offset">数据偏移</param>
        /// <param name="count">数据长度</param>
        /// <param name="stream">Socket网络流</param>
        /// <param name="callback">回调函数</param>
        /// <param name="state">自定义状态</param>
        /// <returns>异步结果</returns>
        public IAsyncResult BeginSend(byte[] data, int offset, int count, Stream stream, AsyncCallback callback, object state)
        {
            if (data == null)
            {
                throw new ArgumentNullException("data");
            }
            if (offset < 0 || offset > data.Length)
            {
                throw new ArgumentOutOfRangeException("offset");
            }
            if (count <= 0 || count > data.Length - offset || count > ushort.MaxValue)
            {
                throw new ArgumentOutOfRangeException("count");
            }
            if (stream == null)
            {
                throw new ArgumentNullException("stream");
            }
            if (!stream.CanWrite)
            {
                throw new ArgumentException("stream can not write");
            }
            if (callback == null)
            {
                throw new ArgumentNullException("callback");
            }

            SocketAsyncResult  result = new SocketAsyncResult(state);
            SocketHandlerState shs    = new SocketHandlerState(); //初始化SocketHandlerState

            shs.Data          = data;
            shs.DataLength    = 0;
            shs.Stream        = stream;
            shs.Completed     = true;
            shs.AsyncResult   = result;
            shs.AsyncCallBack = callback;

            lock (SendQueue)             //锁定SendQueue,避免多线程同时发送数据
            {
                SendQueue.Add(shs);      //添加状态
                if (SendQueue.Count > 1) //表示尚有数据未发送完成
                {
                    return(result);
                }
            }

            try
            {
                stream.BeginWrite(shs.Data, 0, shs.Data.Length, EndWrite, shs);  //开始异步发送数据
            }
            catch
            {
                result.CompletedSynchronously = true;
                shs.Completed = false;
                lock (StateSet)
                    StateSet.Add(result, shs);
                ((AutoResetEvent)result.AsyncWaitHandle).Set();
                callback(result);
            }

            return(result);
        }