Browse Source

Reuse buffer from first pakcage

Remove some debug output
tags/3.4.0
noisyfox 7 years ago
parent
commit
f2b8e91f81
3 changed files with 31 additions and 21 deletions
  1. +4
    -6
      shadowsocks-csharp/Controller/Service/Http2Socks5.cs
  2. +1
    -1
      shadowsocks-csharp/ForwardProxy/HttpProxy.cs
  3. +26
    -14
      shadowsocks-csharp/Util/Sockets/LineReader.cs

+ 4
- 6
shadowsocks-csharp/Controller/Service/Http2Socks5.cs View File

@@ -70,8 +70,8 @@ namespace Shadowsocks.Controller.Service
_socks5Port = socks5Port; _socks5Port = socks5Port;
_localSocket = new WrappedSocket(socket); _localSocket = new WrappedSocket(socket);
_localSocket.SetSocketOption(SocketOptionLevel.Tcp, SocketOptionName.NoDelay, true); _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() private void CheckClose()
@@ -164,8 +164,8 @@ namespace Shadowsocks.Controller.Service


private void SendConnectResponse() 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) private void Http200SendCallback(IAsyncResult ar)
@@ -273,7 +273,6 @@ namespace Shadowsocks.Controller.Service
try try
{ {
int bytesRead = _socks5.EndReceive(ar); int bytesRead = _socks5.EndReceive(ar);
Logging.Debug("Read from remote: " + bytesRead);


if (bytesRead > 0) if (bytesRead > 0)
{ {
@@ -302,7 +301,6 @@ namespace Shadowsocks.Controller.Service
try try
{ {
int bytesRead = _localSocket.EndReceive(ar); int bytesRead = _localSocket.EndReceive(ar);
Logging.Debug("Read from local: " + bytesRead);


if (bytesRead > 0) if (bytesRead > 0)
{ {


+ 1
- 1
shadowsocks-csharp/ForwardProxy/HttpProxy.cs View File

@@ -134,7 +134,7 @@ namespace Shadowsocks.ForwardProxy
_remote.EndSend(ar); _remote.EndSend(ar);


// start line read // 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) catch (Exception ex)
{ {


+ 26
- 14
shadowsocks-csharp/Util/Sockets/LineReader.cs View File

@@ -20,12 +20,16 @@ namespace Shadowsocks.Util.Sockets
private int _bufferDataIndex; private int _bufferDataIndex;
private int _bufferDataLength; 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<string, object, bool> onLineRead, Action<Exception, object> onException, Func<string, object, bool> onLineRead, Action<Exception, object> onException,
Action<byte[], int, int, object> onFinish, Action<byte[], int, int, object> onFinish,
Encoding encoding, string delimiter, int maxLineBytes,
Encoding encoding, string delimiter,
object state) object state)
{ {
if (buffer == null)
{
throw new ArgumentNullException(nameof(buffer));
}
if (socket == null) if (socket == null)
{ {
throw new ArgumentNullException(nameof(socket)); throw new ArgumentNullException(nameof(socket));
@@ -43,9 +47,9 @@ namespace Shadowsocks.Util.Sockets
throw new ArgumentNullException(nameof(delimiter)); 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) if (length > 0)
@@ -72,19 +76,26 @@ namespace Shadowsocks.Util.Sockets
throw new ArgumentException("Too short!", nameof(delimiter)); 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); _delimiterSearch = new ByteSearch.SearchTarget(_delimiterBytes);


_lineBuffer = new byte[maxLineBytes];
_lineBuffer = buffer;


if (length > 0) if (length > 0)
{ {
// process first package // 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; _bufferDataLength = length;


try try
@@ -100,15 +111,16 @@ namespace Shadowsocks.Util.Sockets
else else
{ {
// start reading // start reading
socket.BeginReceive(_lineBuffer, 0, maxLineBytes, 0, ReceiveCallback, 0);
socket.BeginReceive(_lineBuffer, 0, _lineBuffer.Length, 0, ReceiveCallback, 0);
} }
} }


public LineReader(WrappedSocket socket, Func<string, object, bool> onLineRead,
Action<Exception, object> onException,
Action<byte[], int, int, object> 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<string, object, bool> onLineRead,
Action<Exception, object> onException, Action<byte[], int, int, object> onFinish, Encoding encoding,
string delimiter, object state)
: this(
new byte[maxLineBytes], socket, null, 0, 0, onLineRead, onException, onFinish, encoding, delimiter,
state)
{ {
} }




Loading…
Cancel
Save