Example #1
0
        public void addBuff(byte[] buff)
        {
            if (buff == null || buff.Length == 0)
            {
                return;
            }
            RecvBuffer.AddRange(buff);
            if (RecvBuffer.Count <= 2)
            {
                return;
            }
            UInt16 len   = (UInt16)System.Net.IPAddress.HostToNetworkOrder((short)BitConverter.ToUInt16(RecvBuffer.ToArray(), 0));
            int    total = len + 2;

            if (RecvBuffer.Count < total)
            {
                return;
            }
            byte[] tbuff = new byte[len];
            RecvBuffer.CopyTo(2, tbuff, 0, len);
            RecvPacket.BeginRead(tbuff);
            RecvBuffer.RemoveRange(0, total);
        }
Example #2
0
        private bool TryReadNextMessage()
        {
            MessageHeader nextMessageHeader = default(MessageHeader);
            int           bytesRead         = this.consumeStream.Read(this.rereadMessageHeaderBuffer, 0, this.rereadMessageHeaderBuffer.Length);

            if (bytesRead < this.rereadMessageHeaderBuffer.Length)
            {
                // Reset to the start of a new message.
                this.consumeStream.Seek(-bytesRead, SeekOrigin.Current);
                return(false);
            }

            MessageHeader.ReadHeaderFromBuffer(this.rereadMessageHeaderBuffer, 0, ref nextMessageHeader, headerSerializer);

            if (nextMessageHeader.Type == SerializedMessageType.CheckpointData)
            {
                // Skip this because we have already buffered these elements in memory.
                this.consumeStream.Seek(nextMessageHeader.Length, SeekOrigin.Current);
                Console.Error.WriteLine("Skipping a log message of length {0}", nextMessageHeader.Length);
                return(TryReadNextMessage());
            }

            bytesRead = this.consumeStream.Read(this.rereadMessageBodyBuffer, 0, nextMessageHeader.Length);
            if (bytesRead < nextMessageHeader.Length)
            {
                // Reset to the start of a new message.
                this.consumeStream.Seek(-(bytesRead + MessageHeader.SizeOf), SeekOrigin.Current);
                return(false);
            }

            RecvBuffer messageBody = new RecvBuffer(this.rereadMessageBodyBuffer, 0, nextMessageHeader.Length);

            this.currentRereadMessage           = new SerializedMessage(-1, nextMessageHeader, messageBody);
            this.currentRereadMessageEnumerator = this.decoder.Elements(currentRereadMessage).GetEnumerator();
            this.currentRereadMessageEnumerator.MoveNext();
            return(true);
        }
Example #3
0
 public void Clear()
 {
     mSendAsync = false;
     RecvBuffer.Clear(RecvBuffer.Position);
     SendBuffer.ClearPacket();
 }
Example #4
0
        public override void Drain()
        {
            int recordsReceived = 0;

            byte[] consumeBuffer = null;
            for (; this.pagesRead < this.pagesFlushed; ++this.pagesRead)
            {
                Debug.Assert(this.consumeStream.Position % this.pageSize == 0);
                if (consumeBuffer == null)
                {
                    consumeBuffer = ThreadLocalBufferPools <byte> .pool.Value.CheckOut(this.pageSize);
                }
                int bytesRead = this.consumeStream.Read(consumeBuffer, 0, this.pageSize);
                if (bytesRead < this.pageSize)
                {
                    // We must be at the end of the file, where zero-bytes appear to be truncated.

                    MessageHeader innerHeader = default(MessageHeader);
                    MessageHeader.ReadHeaderFromBuffer(consumeBuffer, 0, ref innerHeader);
                    if (innerHeader.Length + MessageHeader.SizeOf == bytesRead)
                    {
                        Logging.Info("Read complete data from partial page {0} bytes", bytesRead);

                        // Get the consume stream in the correct place for the next read.
                        this.consumeStream.Seek(this.pageSize - bytesRead, SeekOrigin.Current);
                    }
                    else
                    {
                        Debug.Assert(false);
                    }
                }
                Debug.Assert(this.consumeStream.Position % this.pageSize == 0);

                if (this.serializer == null)
                {
                    this.serializer = AutoSerialization.GetSerializer <Pair <S, T> >();
                }

                MessageHeader header = default(MessageHeader);
                MessageHeader.ReadHeaderFromBuffer(consumeBuffer, 0, ref header);

                RecvBuffer messageBody = new RecvBuffer(consumeBuffer, MessageHeader.SizeOf, MessageHeader.SizeOf + header.Length);

                Pair <S, T> record;
                while (this.serializer.TryDeserialize(ref messageBody, out record))
                {
                    this.endpoint.RecordReceived(record, new RemotePostbox());
                    if (progressBuffer != null)
                    {
                        progressBuffer.Update(record.v2, -1);
                    }
                    ++recordsReceived;
                }
                Logging.Info("Drained a spilt page into operator {1}", recordsReceived, this.endpoint.Vertex);
            }
            if (recordsReceived > 0)
            {
                this.endpoint.Flush();
                if (this.progressBuffer != null)
                {
                    this.progressBuffer.Flush();
                }

                this.postOffice.Controller.Workers.NotifyOperatorReceivedRecords(this.endpoint.Vertex, this.id, recordsReceived);
                Logging.Info("Drained {0} records into operator {1}", recordsReceived, this.endpoint.Vertex);
            }
            if (consumeBuffer != null)
            {
                ThreadLocalBufferPools <byte> .pool.Value.CheckIn(consumeBuffer);
            }
        }
Example #5
0
 public static bool TryDeserialize <T>(ref RecvBuffer source, out T value)
 {
     return(GetSerializer <T>().TryDeserialize(ref source, out value));
 }
Example #6
0
 public void Clear()
 {
     isSending = false;
     RecvBuffer.Clear(RecvBuffer.Position);
     SendBuffer.ClearPacket();
 }
Example #7
0
        public bool RecvAsync()
        {
            lock (sync)
            {
                // 写入数据内容
                int lastPos = RecvBuffer.Position;
                RecvBuffer.WriteBytes(RecvEventArgs.Buffer, RecvEventArgs.Offset, RecvEventArgs.BytesTransferred);
                RecvBuffer.Clear(RecvBuffer.Position - lastPos); // Position位置回退

                BytesTransferred = BytesTransferred + RecvEventArgs.BytesTransferred;

                bool result = true;

                int byteLenght = 0;
                // 当字节长度大于一个包头时进行处理
                while (BytesTransferred >= sizeof(short))
                {
                    // 包头检查
                    short head = RecvBuffer.ReadInt16();
                    if (head != HEAD)
                    {
                        App.Error("包头错误, 关闭远程连接!");
                        return(false);
                    }
                    BytesTransferred = BytesTransferred - sizeof(short);
                    byteLenght       = byteLenght + sizeof(short);

                    // 包长
                    int length = RecvBuffer.ReadInt32();
                    if ((length > 1024 * 1024) | (RecvBuffer.Position > BufferSize))
                    {
                        // 最大缓存保护
                        App.Error("字节流溢出,即将关闭远程连接!");
                        return(false);
                    }
                    BytesTransferred = BytesTransferred - sizeof(int);
                    byteLenght       = byteLenght + sizeof(int);

                    lastPos = RecvBuffer.Position;

                    int packetID = RecvBuffer.ReadInt32();
                    RecvBuffer.Clear(RecvBuffer.Position - lastPos);

                    IPacket oPacket = PacketMgr.CreatePacket(packetID);
                    try
                    {
                        lastPos = RecvBuffer.Position;
                        oPacket.Serialization(RecvBuffer, false);
                        int oDataLength = RecvBuffer.Position - lastPos;
                        BytesTransferred = BytesTransferred - oDataLength;
                        byteLenght       = byteLenght + oDataLength;
                        // 接收包
                        oPacket.SetOwner(Owner);
                        oPacket.SetSession(this);
                        PacketMgr.Push(oPacket);
                    }
                    catch (Exception e)
                    {
                        App.Error("协议解析出错, 即将关闭远程连接\n{0}", e);
                        return(false);
                    }
                }

                RecvBuffer.Clear(byteLenght);

                return(result);
            }
        }