private MessageSegmentParser CreateSegmentParser(IPEndPoint remoteEndPoint, MessageSegment segment) { MessageSegmentParser segmentParser = new MessageSegmentParser(remoteEndPoint, segment.MessageId, segment.TotalLength); segmentParser.DataReceived += SegmentParser_DataReceived; return(segmentParser); }
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); } } }
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); } } }