From 040e007da39236c364b1790003f2d82a34a6de90 Mon Sep 17 00:00:00 2001 From: xljiulang <366193849@qq.com> Date: Sat, 2 Jan 2016 23:59:31 +0800 Subject: [PATCH] =?UTF-8?q?=E6=80=A7=E8=83=BD=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Net40/NetworkSocket/ByteRange.cs | 2 +- Net40/NetworkSocket/Http/Result/FileResult.cs | 3 +- Net40/NetworkSocket/IByteRange.cs | 7 ---- .../NetworkSocket/Internal/IocpTcpSession.cs | 41 ++++++------------- Net40/NetworkSocket/Internal/SslTcpSession.cs | 32 +++++---------- 5 files changed, 25 insertions(+), 60 deletions(-) diff --git a/Net40/NetworkSocket/ByteRange.cs b/Net40/NetworkSocket/ByteRange.cs index 741e2dd..4802db7 100644 --- a/Net40/NetworkSocket/ByteRange.cs +++ b/Net40/NetworkSocket/ByteRange.cs @@ -80,7 +80,7 @@ public ByteRange(byte[] buffer, int offset, int count) /// /// 新的ByteRange大小 /// - public IEnumerable SplitBySize(int size) + public IEnumerable SplitBySize(int size) { if (size >= this.Count) { diff --git a/Net40/NetworkSocket/Http/Result/FileResult.cs b/Net40/NetworkSocket/Http/Result/FileResult.cs index 72d3e30..bbfc5f2 100644 --- a/Net40/NetworkSocket/Http/Result/FileResult.cs +++ b/Net40/NetworkSocket/Http/Result/FileResult.cs @@ -60,17 +60,16 @@ public void ExecuteResult(HttpResponse response) using (var stream = new FileStream(this.FileName, FileMode.Open, FileAccess.Read)) { const int size = 8 * 1024; + var bytes = new byte[size]; var state = response.WriteHeader((int)stream.Length); while (state == true) { - var bytes = new byte[size]; var length = stream.Read(bytes, 0, size); if (length == 0) { break; } - var content = new ByteRange(bytes, 0, length); state = response.WriteContent(content); } diff --git a/Net40/NetworkSocket/IByteRange.cs b/Net40/NetworkSocket/IByteRange.cs index 40466c4..554c492 100644 --- a/Net40/NetworkSocket/IByteRange.cs +++ b/Net40/NetworkSocket/IByteRange.cs @@ -24,12 +24,5 @@ public interface IByteRange /// 获取字节数组 /// byte[] Buffer { get; } - - /// - /// 分割为大小相等的ByteRange集合 - /// - /// 新的ByteRange大小 - /// - IEnumerable SplitBySize(int size); } } diff --git a/Net40/NetworkSocket/Internal/IocpTcpSession.cs b/Net40/NetworkSocket/Internal/IocpTcpSession.cs index 51ec06a..a7ef343 100644 --- a/Net40/NetworkSocket/Internal/IocpTcpSession.cs +++ b/Net40/NetworkSocket/Internal/IocpTcpSession.cs @@ -45,7 +45,6 @@ public IocpTcpSession() { this.sendArg.Completed += this.SendCompleted; this.recvArg.Completed += this.RecvCompleted; - BufferManager.SetBuffer(this.sendArg); BufferManager.SetBuffer(this.recvArg); } @@ -131,34 +130,20 @@ public override void Send(IByteRange byteRange) throw new SocketException((int)SocketError.NotConnected); } - var byteRanges = byteRange.SplitBySize(this.sendArg.Count); - foreach (var range in byteRanges) - { - this.SendByteRange(range); - } - } - - /// - /// 发送一个小于缓冲区的数据范围 - /// - /// 数据范围 - private bool SendByteRange(IByteRange byteRange) - { // 如果发送过程已停止,则本次直接发送 if (Interlocked.CompareExchange(ref this.PendingSendCount, 1, 0) == 0) { - return this.TrySendByteRangeAsync(byteRange); + this.TrySendByteRangeAsync(byteRange); } - - // 添加数据到缓存区 - this.PendingSendByteRanges.Enqueue(byteRange); - - // 如果发送过程已停止,则启动发送缓存中的数据 - if (Interlocked.Increment(ref this.PendingSendCount) == 1) + else { - return this.TrySendByteRangeAsync(null); + this.PendingSendByteRanges.Enqueue(byteRange); + // 如果发送过程已停止,则启动发送缓存中的数据 + if (Interlocked.Increment(ref this.PendingSendCount) == 1) + { + this.TrySendByteRangeAsync(null); + } } - return true; } @@ -167,19 +152,17 @@ private bool SendByteRange(IByteRange byteRange) /// 发送完成将触发SendCompleted方法 /// 数据范围,为null则从缓冲中区获取 /// - private bool TrySendByteRangeAsync(IByteRange byteRange) + private void TrySendByteRangeAsync(IByteRange byteRange) { if (byteRange == null && this.PendingSendByteRanges.TryDequeue(out byteRange) == false) { Interlocked.Exchange(ref this.PendingSendCount, 0); - return false; + return; } - Buffer.BlockCopy(byteRange.Buffer, byteRange.Offset, this.sendArg.Buffer, this.sendArg.Offset, byteRange.Count); - this.sendArg.SetBuffer(this.sendArg.Offset, byteRange.Count); - - return base.TryInvokeAction(() => + base.TryInvokeAction(() => { + this.sendArg.SetBuffer(byteRange.Buffer, byteRange.Offset, byteRange.Count); if (this.Socket.SendAsync(this.sendArg) == false) { this.SendCompleted(this.Socket, this.sendArg); diff --git a/Net40/NetworkSocket/Internal/SslTcpSession.cs b/Net40/NetworkSocket/Internal/SslTcpSession.cs index 052a10b..996a808 100644 --- a/Net40/NetworkSocket/Internal/SslTcpSession.cs +++ b/Net40/NetworkSocket/Internal/SslTcpSession.cs @@ -198,30 +198,20 @@ public override void Send(IByteRange byteRange) throw new SocketException((int)SocketError.NotConnected); } - this.SendByteRange(byteRange); - } - - /// - /// 发送一个小于缓冲区的数据范围 - /// - /// 数据范围 - private bool SendByteRange(IByteRange byteRange) - { // 如果发送过程已停止,则本次直接发送 if (Interlocked.CompareExchange(ref this.PendingSendCount, 1, 0) == 0) { - return this.TrySendByteRangeAsync(byteRange); + this.TrySendByteRangeAsync(byteRange); } - - // 添加数据到缓存区 - this.PendingSendByteRanges.Enqueue(byteRange); - - // 如果发送过程已停止,则启动发送缓存中的数据 - if (Interlocked.Increment(ref this.PendingSendCount) == 1) + else { - return this.TrySendByteRangeAsync(null); + this.PendingSendByteRanges.Enqueue(byteRange); + // 如果发送过程已停止,则启动发送缓存中的数据 + if (Interlocked.Increment(ref this.PendingSendCount) == 1) + { + this.TrySendByteRangeAsync(null); + } } - return true; } /// @@ -229,15 +219,15 @@ private bool SendByteRange(IByteRange byteRange) /// 发送完成将触发SendCompleted方法 /// 数据范围,为null则从缓冲中区获取 /// - private bool TrySendByteRangeAsync(IByteRange byteRange) + private void TrySendByteRangeAsync(IByteRange byteRange) { if (byteRange == null && this.PendingSendByteRanges.TryDequeue(out byteRange) == false) { Interlocked.Exchange(ref this.PendingSendCount, 0); - return false; + return; } - return base.TryInvokeAction(() => + base.TryInvokeAction(() => this.sslStream.BeginWrite( byteRange.Buffer, byteRange.Offset,