Ejemplo n.º 1
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)
        {
            //stream不能为null
            if (stream == null)
            {
                throw new ArgumentNullException(nameof(stream));
            }
            //回调函数不能为null
            if (callback == null)
            {
                throw new ArgumentNullException(nameof(callback));
            }
            //stream异常
            if (!stream.CanRead)
            {
                throw new ArgumentException("stream不支持读取。");
            }

            SocketAsyncResult result = new SocketAsyncResult(state);

            //初始化SocketHandlerState
            SocketHandlerState shs = new SocketHandlerState
            {
                Data          = new byte[2],
                AsyncResult   = result,
                Stream        = stream,
                AsyncCallBack = callback,
                Completed     = true
            };

            //开始异步接收长度为2的头信息
            //该头信息包含要接收的主要数据长度
            stream.BeginRead(shs.Data, 0, 2, EndRead, shs);
            return(result);
        }
Ejemplo n.º 2
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)
        {
            //data不能为null
            if (data == null)
            {
                throw new ArgumentNullException(nameof(data));
            }
            //offset不能小于0和超过data长度
            if (offset > data.Length || offset < 0)
            {
                throw new ArgumentOutOfRangeException(nameof(offset));
            }
            //count不能大于65535
            if (count <= 0 || count > data.Length - offset || count > ushort.MaxValue)
            {
                throw new ArgumentOutOfRangeException(nameof(count));
            }
            //stream不能为null
            if (stream == null)
            {
                throw new ArgumentNullException(nameof(stream));
            }
            //回调函数不能为null
            if (callback == null)
            {
                throw new ArgumentNullException(nameof(callback));
            }
            //stream异常
            if (!stream.CanWrite)
            {
                throw new ArgumentException("stream不支持写入。");
            }

            SocketAsyncResult result = new SocketAsyncResult(state);

            //初始化SocketHandlerState
            SocketHandlerState shs = new SocketHandlerState
            {
                Data          = data,
                AsyncResult   = result,
                Stream        = stream,
                AsyncCallBack = callback,
                DataLength    = 0
            };

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

            //获取数据长度
            //ushort的最大值为65535
            //转换为byte[]长度为2
            var dataLength = BitConverter.GetBytes((ushort)data.Length);

            //向对方发送长度为2的头信息,表示接下来要发送的数据长度
            stream.Write(dataLength, 0, dataLength.Length);
            //开始异步发送数据
            stream.BeginWrite(shs.Data, 0, shs.Data.Length, EndWrite, shs).AsyncWaitHandle.WaitOne();

            return(result);
        }