From f2b8e91f81fd7975f19826cac2a9a94e59833d69 Mon Sep 17 00:00:00 2001 From: noisyfox Date: Sat, 3 Dec 2016 19:27:24 +1100 Subject: [PATCH] Reuse buffer from first pakcage Remove some debug output --- .../Controller/Service/Http2Socks5.cs | 10 ++--- shadowsocks-csharp/ForwardProxy/HttpProxy.cs | 2 +- shadowsocks-csharp/Util/Sockets/LineReader.cs | 40 ++++++++++++------- 3 files changed, 31 insertions(+), 21 deletions(-) diff --git a/shadowsocks-csharp/Controller/Service/Http2Socks5.cs b/shadowsocks-csharp/Controller/Service/Http2Socks5.cs index 6ec9f6ab..adaa3896 100644 --- a/shadowsocks-csharp/Controller/Service/Http2Socks5.cs +++ b/shadowsocks-csharp/Controller/Service/Http2Socks5.cs @@ -70,8 +70,8 @@ namespace Shadowsocks.Controller.Service _socks5Port = socks5Port; _localSocket = new WrappedSocket(socket); _localSocket.SetSocketOption(SocketOptionLevel.Tcp, SocketOptionName.NoDelay, true); - new LineReader(_localSocket, firstPacket, 0, length, OnLineRead, OnException, OnFinish, - Encoding.UTF8, HTTP_CRLF, 1024, null); + new LineReader(firstPacket, _localSocket, firstPacket, 0, length, OnLineRead, OnException, OnFinish, + Encoding.UTF8, HTTP_CRLF, null); } private void CheckClose() @@ -164,8 +164,8 @@ namespace Shadowsocks.Controller.Service private void SendConnectResponse() { - var b = Encoding.UTF8.GetBytes(HTTP_CONNECT_200); - _localSocket.BeginSend(b, 0, b.Length, SocketFlags.None, Http200SendCallback, null); + var len = Encoding.UTF8.GetBytes(HTTP_CONNECT_200, 0, HTTP_CONNECT_200.Length, _remoteRecvBuffer, 0); + _localSocket.BeginSend(_remoteRecvBuffer, 0, len, SocketFlags.None, Http200SendCallback, null); } private void Http200SendCallback(IAsyncResult ar) @@ -273,7 +273,6 @@ namespace Shadowsocks.Controller.Service try { int bytesRead = _socks5.EndReceive(ar); - Logging.Debug("Read from remote: " + bytesRead); if (bytesRead > 0) { @@ -302,7 +301,6 @@ namespace Shadowsocks.Controller.Service try { int bytesRead = _localSocket.EndReceive(ar); - Logging.Debug("Read from local: " + bytesRead); if (bytesRead > 0) { diff --git a/shadowsocks-csharp/ForwardProxy/HttpProxy.cs b/shadowsocks-csharp/ForwardProxy/HttpProxy.cs index bdabdb9c..5fe3f826 100644 --- a/shadowsocks-csharp/ForwardProxy/HttpProxy.cs +++ b/shadowsocks-csharp/ForwardProxy/HttpProxy.cs @@ -134,7 +134,7 @@ namespace Shadowsocks.ForwardProxy _remote.EndSend(ar); // start line read - new LineReader(_remote, OnLineRead, OnException, OnFinish, Encoding.UTF8, HTTP_CRLF, 1024, new FakeAsyncResult(ar, state)); + new LineReader(1024, _remote, OnLineRead, OnException, OnFinish, Encoding.UTF8, HTTP_CRLF, new FakeAsyncResult(ar, state)); } catch (Exception ex) { diff --git a/shadowsocks-csharp/Util/Sockets/LineReader.cs b/shadowsocks-csharp/Util/Sockets/LineReader.cs index 9bd40321..05c2f008 100644 --- a/shadowsocks-csharp/Util/Sockets/LineReader.cs +++ b/shadowsocks-csharp/Util/Sockets/LineReader.cs @@ -20,12 +20,16 @@ namespace Shadowsocks.Util.Sockets private int _bufferDataIndex; private int _bufferDataLength; - public LineReader(WrappedSocket socket, byte[] firstPackge, int index, int length, + public LineReader(byte[] buffer, WrappedSocket socket, byte[] firstPackge, int index, int length, Func onLineRead, Action onException, Action onFinish, - Encoding encoding, string delimiter, int maxLineBytes, + Encoding encoding, string delimiter, object state) { + if (buffer == null) + { + throw new ArgumentNullException(nameof(buffer)); + } if (socket == null) { throw new ArgumentNullException(nameof(socket)); @@ -43,9 +47,9 @@ namespace Shadowsocks.Util.Sockets throw new ArgumentNullException(nameof(delimiter)); } - if (maxLineBytes < length) + if (buffer.Length < length) { - throw new ArgumentException("Line buffer length can't less than first package length!", nameof(maxLineBytes)); + throw new ArgumentException("Line buffer length can't less than first package length!", nameof(buffer)); } if (length > 0) @@ -72,19 +76,26 @@ namespace Shadowsocks.Util.Sockets throw new ArgumentException("Too short!", nameof(delimiter)); } - if (maxLineBytes < _delimiterBytes.Length) + if (buffer.Length < _delimiterBytes.Length) { - throw new ArgumentException("Too small!", nameof(maxLineBytes)); + throw new ArgumentException("Too small!", nameof(buffer)); } _delimiterSearch = new ByteSearch.SearchTarget(_delimiterBytes); - _lineBuffer = new byte[maxLineBytes]; + _lineBuffer = buffer; if (length > 0) { // process first package - Array.Copy(firstPackge, index, _lineBuffer, 0, length); + if (buffer == firstPackge) + { + _bufferDataIndex = index; + } + else + { + Array.Copy(firstPackge, index, _lineBuffer, 0, length); + } _bufferDataLength = length; try @@ -100,15 +111,16 @@ namespace Shadowsocks.Util.Sockets else { // start reading - socket.BeginReceive(_lineBuffer, 0, maxLineBytes, 0, ReceiveCallback, 0); + socket.BeginReceive(_lineBuffer, 0, _lineBuffer.Length, 0, ReceiveCallback, 0); } } - public LineReader(WrappedSocket socket, Func onLineRead, - Action onException, - Action onFinish, Encoding encoding, string delimiter, int maxLineBytes, - object state) - : this(socket, null, 0, 0, onLineRead, onException, onFinish, encoding, delimiter, maxLineBytes, state) + public LineReader(int maxLineBytes, WrappedSocket socket, Func onLineRead, + Action onException, Action onFinish, Encoding encoding, + string delimiter, object state) + : this( + new byte[maxLineBytes], socket, null, 0, 0, onLineRead, onException, onFinish, encoding, delimiter, + state) { }