public override void Send(System.IO.Stream stream, TimeSpan timeout, Information options) { if (_disposed) throw new ObjectDisposedException(this.GetType().FullName); if (!_connect) throw new ConnectionException(); if (stream == null) throw new ArgumentNullException(nameof(stream)); if (stream.Length == 0) throw new ArgumentOutOfRangeException(nameof(stream)); bool isCompress = true; if (options != null) { if (options.Contains("IsCompress")) isCompress = (bool)options["IsCompress"]; } lock (_sendLock) { using (RangeStream targetStream = new RangeStream(stream, stream.Position, stream.Length - stream.Position, true)) { try { var list = new List<KeyValuePair<byte, Stream>>(); if (isCompress) { if (_otherCompressAlgorithm.HasFlag(CompressAlgorithm.Deflate)) { BufferStream deflateBufferStream = null; try { deflateBufferStream = new BufferStream(_bufferManager); using (DeflateStream deflateStream = new DeflateStream(deflateBufferStream, CompressionMode.Compress, true)) using (var safeBuffer = _bufferManager.CreateSafeBuffer(1024 * 4)) { int length; while ((length = targetStream.Read(safeBuffer.Value, 0, safeBuffer.Value.Length)) > 0) { deflateStream.Write(safeBuffer.Value, 0, length); } } deflateBufferStream.Seek(0, SeekOrigin.Begin); list.Add(new KeyValuePair<byte, Stream>((byte)1, deflateBufferStream)); } catch (Exception e) { if (deflateBufferStream != null) { deflateBufferStream.Dispose(); } throw e; } } } list.Add(new KeyValuePair<byte, Stream>((byte)0, new WrapperStream(targetStream, true))); list.Sort((x, y) => { int c = x.Value.Length.CompareTo(y.Value.Length); if (c != 0) return c; return x.Key.CompareTo(y.Key); }); #if DEBUG if (list[0].Value.Length != targetStream.Length) { Debug.WriteLine("Send : {0}→{1} {2}", NetworkConverter.ToSizeString(targetStream.Length), NetworkConverter.ToSizeString(list[0].Value.Length), NetworkConverter.ToSizeString(list[0].Value.Length - targetStream.Length)); } #endif for (int i = 1; i < list.Count; i++) { list[i].Value.Dispose(); } var headerStream = new BufferStream(_bufferManager); headerStream.WriteByte((byte)list[0].Key); using (var dataStream = new UniteStream(headerStream, list[0].Value)) { _connection.Send(dataStream, timeout, options); } } catch (ConnectionException e) { throw e; } catch (Exception e) { throw new ConnectionException(e.Message, e); } } } }
public override void Send(Stream stream, TimeSpan timeout, Information options) { if (_disposed) throw new ObjectDisposedException(this.GetType().FullName); if (!_connect) throw new ConnectionException(); if (stream == null) throw new ArgumentNullException(nameof(stream)); if (stream.Length == 0) throw new ArgumentOutOfRangeException(nameof(stream)); lock (_sendLock) { using (RangeStream targetStream = new RangeStream(stream, stream.Position, stream.Length - stream.Position, true)) { try { _sendStopwatch.Restart(); Stream headerStream = new BufferStream(_bufferManager); headerStream.Write(NetworkConverter.GetBytes((int)targetStream.Length), 0, 4); using (Stream dataStream = new UniteStream(headerStream, new WrapperStream(targetStream, true))) using (var safeBuffer = _bufferManager.CreateSafeBuffer(1024 * 32)) { for (;;) { var sendLength = (int)Math.Min(dataStream.Length - dataStream.Position, safeBuffer.Value.Length); if (sendLength == 0) break; if (_bandwidthLimit != null && _bandwidthLimit.Out != 0) { sendLength = _bandwidthLimit.GetOutBandwidth(this, sendLength); if (sendLength < 0) throw new ConnectionException(); } dataStream.Read(safeBuffer.Value, 0, sendLength); var time = Connection.CheckTimeout(_sendStopwatch.Elapsed, timeout); time = (time < _sendTimeSpan) ? time : _sendTimeSpan; _cap.Send(safeBuffer.Value, 0, sendLength, time); _aliveStopwatch.Restart(); _sentByteCount.Add(sendLength); } } _aliveTimer.Change(1000 * 30); } catch (ConnectionException e) { throw e; } catch (Exception e) { throw new ConnectionException(e.Message, e); } } } }
public void Test_UniteStream() { using (MemoryStream memoryStream1 = new MemoryStream(new byte[] { 0, 1, 2, 3, 4, 5, 6, 7 })) using (MemoryStream memoryStream2 = new MemoryStream(new byte[] { 8, 9, 10, 11, 12, 13, 14 })) { using (UniteStream addStream = new UniteStream(new RangeStream(memoryStream1, 2, 4), new RangeStream(memoryStream2, 2, 4))) { byte[] buffer1 = new byte[2]; addStream.Read(buffer1, 0, buffer1.Length); Assert.IsTrue(CollectionUtilities.Equals(new byte[] { 2, 3 }, buffer1), "UniteStream #1"); byte[] buffer2 = new byte[2]; addStream.Read(buffer2, 0, buffer2.Length); Assert.IsTrue(CollectionUtilities.Equals(new byte[] { 4, 5 }, buffer2), "UniteStream #2"); byte[] buffer3 = new byte[2]; addStream.Read(buffer3, 0, buffer3.Length); Assert.IsTrue(CollectionUtilities.Equals(new byte[] { 10, 11 }, buffer3), "UniteStream #3"); byte[] buffer4 = new byte[2]; addStream.Read(buffer4, 0, buffer4.Length); Assert.IsTrue(CollectionUtilities.Equals(new byte[] { 12, 13 }, buffer4), "UniteStream #4"); } } }
public override void Send(System.IO.Stream stream, TimeSpan timeout, Information options) { if (_disposed) throw new ObjectDisposedException(this.GetType().FullName); if (!_connect) throw new ConnectionException(); if (stream == null) throw new ArgumentNullException(nameof(stream)); if (stream.Length == 0) throw new ArgumentOutOfRangeException(nameof(stream)); lock (_sendLock) { using (RangeStream targetStream = new RangeStream(stream, stream.Position, stream.Length - stream.Position, true)) { try { using (MemoryStream crcStream = new MemoryStream(Crc32_Castagnoli.ComputeHash(targetStream))) using (Stream dataStream = new UniteStream(new WrapperStream(targetStream, true), crcStream)) { _connection.Send(dataStream, timeout, options); } } catch (ConnectionException e) { throw e; } catch (Exception e) { throw new ConnectionException(e.Message, e); } } } }