Пример #1
0
        public static IAsyncResult BeginReceive(this Socket socket, ByteArray bytes, AsyncCallback callback, object state)
        {
            Int32 offset = bytes.offset + bytes.size;
            Int32 size   = bytes.GetFreeLength();

            return(socket.BeginReceive(bytes.buffer, offset, size, 0, callback, state));
        }
Пример #2
0
        public void Update(Int32 count)
        {
            if (count <= 0)
            {
                return;
            }

            lock (recvBuffer)
            {
                recvBuffer.Add(count);
                while (recvBuffer.size > 0)
                {
                    Int32 totalLen = recvBuffer.size;
                    if (m_BuildBuffer != null)
                    {
                        Int32 remainLen  = m_BuildBuffer.GetFreeLength();
                        Int32 receiveLen = (remainLen <= totalLen ? remainLen : totalLen);
                        Int32 size       = m_BuildBuffer.Add(recvBuffer, 0, receiveLen);
                        recvBuffer.Remove(size);

                        if (m_BuildBuffer.GetFreeLength() <= 0)
                        {
                            // 已完全接收一条数据
                            lock (m_DataQueue)
                            {
                                m_DataQueue.Enqueue(m_BuildBuffer);
                            }
                            m_BuildBuffer = null;
                        }
                    }
                    else if (recvBuffer.size >= 2)
                    {
                        Int16 len = LittleEndianByte.GetInt16(recvBuffer);
                        recvBuffer.Remove(2);
                        m_BuildBuffer = new ByteArray(len);
                    }
                    else
                    {
                        // 数据接收完毕或不足凑一个 Int16
                        break;
                    }
                }
            }
        }