Beispiel #1
0
    /// <summary>
    /// 如果数据满了,且缓冲区内的数据是空的则返回需要发送的数据
    /// 调用Enqueue(...)后调用Dequeue(...),不能直接调用Dequeue(...)
    /// </summary>
    /// <param name="byteBuffer"></param>
    /// <param name="iOffset"></param>
    /// <param name="iLength"></param>
    /// <returns></returns>
    public void Enqueue(byte[] byteBuffer, long iOffset, long iLength)
    {
        if (byteBuffer == null)
        {
            throw new Exception("SendQueue.Enqueue(...) - byteBuffer == null error!");
        }

        if (iOffset < 0 || iOffset >= byteBuffer.Length)
        {
            throw new Exception("SendQueue.Enqueue(...) - iOffset < 0 || iOffset >= byteBuffer.Length error!");
        }

        if (iLength < 0 || iLength > byteBuffer.Length) // 如果iLength == 0就返回空,如果iLength == 0就跳过
        {
            throw new Exception("SendQueue.Enqueue(...) - iLength < 0 || iLength > byteBuffer.Length error!");
        }

        if ((byteBuffer.Length - iOffset) < iLength)
        {
            throw new Exception("SendQueue.Enqueue(...) - ( byteBuffer.Length - iOffset ) < iLength error!");
        }

        m_LockFlushAndPending.Enter();
        {
            do
            {
                if (m_FlushBuffer.IsNull == true)
                {
                    // nothing yet buffered
                    m_FlushBuffer = SendBuffer.Instance();

                    if (m_FlushBuffer.IsNull == true)
                    {
                        throw new Exception("SendQueue.Enqueue(...) - m_FlushBuffer.IsNull == true error!");
                    }
                }

                // 当前已经写入的字节
                long iBytesWritten = m_FlushBuffer.Write(byteBuffer, iOffset, iLength);

                iOffset += iBytesWritten;
                iLength -= iBytesWritten;

                // 写入需要发送的数据的大小
                m_WaitSendSize += iBytesWritten;

                // 如果数据没有满,且数据写入完毕则退出,返回空,不添加到集合内
                if (m_FlushBuffer.IsFull == true)
                {
                    // 如果满了添加到集合内的尾处
                    m_PendingBuffer.Enqueue(m_FlushBuffer);
                    m_FlushBuffer = SendBuffer.NullBuffer; // 置空再次请求缓存
                }
            } while (iLength > 0);
        }
        m_LockFlushAndPending.Exit();
    }
Beispiel #2
0
        public void InstanceTest()
        {
            SendBuffer expected = new SendBuffer(); // TODO: 初始化为适当的值
            SendBuffer actual;

            actual = SendBuffer.Instance();
            Assert.AreEqual(expected, actual);
            Assert.Inconclusive("验证此测试方法的正确性。");
        }