Example #1
0
        /// <summary>
        /// 检查队列里是否有要发送的数据,如果有则进行发送处理
        /// </summary>
        public void PeekSend()
        {
            lock (m_PendingBuffer)
            {
                if (isSending || m_PendingBuffer.Count == 0)
                {
                    return;
                }

                //  TODO 这里要不要考虑进行并报发送处理
                isSending = true;

                if (m_PendingBuffer.Count > 1)
                {
                    //   2 个包以上,进行拼包后再发送
                    var buffs = m_PendingBuffer.ToArray();
                    m_PendingBuffer.Clear();

                    int offSet = 0;
                    foreach (var b in buffs)
                    {
                        offSet += b.Length;
                    }

                    DogBuffer sendBuff;

                    if (offSet < 4000)
                    {
                        sendBuff = DogBuffer.GetFromPool4K();
                    }
                    else
                    {
                        sendBuff = DogBuffer.GetFromPool32K();
                    }

                    foreach (var buff in buffs)
                    {
                        Buffer.BlockCopy(buff.Bytes, 0, sendBuff.Bytes, sendBuff.Length, buff.Length);
                        sendBuff.Length += buff.Length;
                        buff.Release();
                    }

                    SendEventArgs.UserToken = sendBuff;
                    SendEventArgs.SetBuffer(sendBuff.Bytes, 0, sendBuff.Length);
                    Socket.SendAsync(SendEventArgs);
                }
                else
                {
                    DogBuffer buff;
                    buff = m_PendingBuffer.Dequeue();
                    SendEventArgs.UserToken = buff;
                    SendEventArgs.SetBuffer(buff.Bytes, 0, buff.Length);
                    Socket.SendAsync(SendEventArgs);
                }
            }
        }
Example #2
0
        /// <summary>
        /// 重新异步开始接受数据
        /// </summary>
        internal void SyncRecvData()
        {
            if (Socket == null || !Socket.Connected)
            {
                return;
            }

            var buff = DogBuffer.GetFromPool4K();

            RecvBuffer = buff;
            ReceiveEventArgs.SetBuffer(buff.Bytes, 0, buff.Bytes.Length);
            Socket.ReceiveAsync(ReceiveEventArgs);
        }