Exemplo n.º 1
0
        private MessageSegmentParser CreateSegmentParser(IPEndPoint remoteEndPoint, MessageSegment segment)
        {
            MessageSegmentParser segmentParser = new MessageSegmentParser(remoteEndPoint, segment.MessageId, segment.TotalLength);

            segmentParser.DataReceived += SegmentParser_DataReceived;
            return(segmentParser);
        }
Exemplo n.º 2
0
        public void AddData(IPEndPoint remoteEndPoint, byte[] data)
        {
            lock (_parseData)
            {
                var segment = MessageSegment.Create(data);
                if (segment == null)
                {
                    return;
                }

                var endPointInfo = new EndPointInfo(remoteEndPoint);
                Dictionary <Guid, MessageSegmentParser> parsers;
                if (_parseData.ContainsKey(endPointInfo))
                {
                    parsers = _parseData[endPointInfo];
                }
                else
                {
                    parsers = new Dictionary <Guid, MessageSegmentParser>();
                    _parseData.Add(endPointInfo, parsers);
                }


                MessageSegmentParser segmentParser;
                if (parsers.ContainsKey(segment.MessageId))
                {
                    segmentParser = parsers[segment.MessageId];
                }
                else
                {
                    segmentParser = CreateSegmentParser(remoteEndPoint, segment);
                    parsers.Add(segment.MessageId, segmentParser);
                }

                try
                {
                    segmentParser.AddSegment(segment);

                    // TODO: 发送片断应答。
                }
                catch
                {
                    RemoveSegmentParser(segmentParser);
                }
            }
        }
Exemplo n.º 3
0
        public void AddSegment(MessageSegment segment)
        {
            if (this.MessageId != segment.MessageId || this.TotalLength != segment.TotalLength)
            {
                throw new InvalidOperationException();
            }

            if (!_segments.ContainsKey(segment.SegmentNumber))
            {
                _segments.Add(segment.SegmentNumber, segment);
                this.ReceivedLength += segment.Length;

                if (this.ReceivedLength == this.TotalLength)
                {
                    var result = new byte[this.TotalLength];

                    int offset = 0;
                    for (int i = 0; i < _segments.Count; i++)
                    {
                        var current = _segments[i];

                        if (offset != current.Offset)
                        {
                            throw new InvalidOperationException();
                        }
                        Array.Copy(current.Data, 0, result, offset, current.Length);

                        offset += current.Length;
                    }

                    if (offset != this.TotalLength)
                    {
                        throw new InvalidOperationException();
                    }
                    OnMessageReceived(result);
                }
            }
        }