From 4b3ec386911cf7ec1a7be941688cf640a626961f Mon Sep 17 00:00:00 2001 From: kimw Date: Sun, 15 May 2016 01:34:28 -0400 Subject: [PATCH 1/7] featured print "connect to hostname:port" to log --- .../Controller/Service/TCPRelay.cs | 37 +++++++++++++------ shadowsocks-csharp/Util/Util.cs | 6 ++- 2 files changed, 29 insertions(+), 14 deletions(-) diff --git a/shadowsocks-csharp/Controller/Service/TCPRelay.cs b/shadowsocks-csharp/Controller/Service/TCPRelay.cs index 9c162780..808f1f6f 100644 --- a/shadowsocks-csharp/Controller/Service/TCPRelay.cs +++ b/shadowsocks-csharp/Controller/Service/TCPRelay.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Linq; using System.Net; using System.Net.Sockets; using System.Timers; @@ -15,10 +16,7 @@ namespace Shadowsocks.Controller private ShadowsocksController _controller; private DateTime _lastSweepTime; - public ISet Handlers - { - get; set; - } + public ISet Handlers { get; set; } public TCPRelay(ShadowsocksController controller) { @@ -389,10 +387,7 @@ namespace Shadowsocks.Controller private class ServerTimer : Timer { public Server Server; - - public ServerTimer(int p) : base(p) - { - } + public ServerTimer(int p) : base(p) { } } private void StartConnect() @@ -484,8 +479,6 @@ namespace Shadowsocks.Controller connected = true; - Logging.Debug($"Socket connected to {remote.RemoteEndPoint}"); - var latency = DateTime.Now - _startConnectTime; IStrategy strategy = controller.GetCurrentStrategy(); strategy?.UpdateLatency(server, latency); @@ -554,7 +547,6 @@ namespace Shadowsocks.Controller } encryptor.Decrypt(remoteRecvBuffer, bytesRead, remoteSendBuffer, out bytesToSend); } - Logging.Debug(remote, bytesToSend, "TCP Relay", "@PipeRemoteReceiveCallback() (download)"); connection.BeginSend(remoteSendBuffer, 0, bytesToSend, 0, new AsyncCallback(PipeConnectionSendCallback), null); IStrategy strategy = controller.GetCurrentStrategy(); @@ -597,6 +589,28 @@ namespace Shadowsocks.Controller if (bytesRead > 0) { + int atyp = connetionRecvBuffer[0]; + string dst_addr; + int dst_port; + switch (atyp) + { + case 1: // IPv4 address, 4 bytes + dst_addr = new IPAddress(connetionRecvBuffer.Skip(1).Take(4).ToArray()).ToString(); + dst_port = (connetionRecvBuffer[5] << 8) + connetionRecvBuffer[6]; + Logging.Debug($"connect to {dst_addr}:{dst_port}"); + break; + case 3: // domain name, length + str + int len = connetionRecvBuffer[1]; + dst_addr = System.Text.Encoding.UTF8.GetString(connetionRecvBuffer, 2, len); + dst_port = (connetionRecvBuffer[len + 2] << 8) + connetionRecvBuffer[len + 3]; + Logging.Debug($"connect to {dst_addr}:{dst_port}"); + break; + case 4: // IPv6 address, 16 bytes + dst_addr = new IPAddress(connetionRecvBuffer.Skip(1).Take(16).ToArray()).ToString(); + dst_port = (connetionRecvBuffer[17] << 8) + connetionRecvBuffer[18]; + Logging.Debug($"connect to [{dst_addr}]:{dst_port}"); + break; + } int bytesToSend; lock (encryptionLock) { @@ -606,7 +620,6 @@ namespace Shadowsocks.Controller } encryptor.Encrypt(connetionRecvBuffer, bytesRead, connetionSendBuffer, out bytesToSend); } - Logging.Debug(remote, bytesToSend, "TCP Relay", "@PipeConnectionReceiveCallback() (upload)"); tcprelay.UpdateOutboundCounter(server, bytesToSend); _startSendingTime = DateTime.Now; _bytesToSend = bytesToSend; diff --git a/shadowsocks-csharp/Util/Util.cs b/shadowsocks-csharp/Util/Util.cs index 178c994b..3d09db7a 100755 --- a/shadowsocks-csharp/Util/Util.cs +++ b/shadowsocks-csharp/Util/Util.cs @@ -76,7 +76,8 @@ namespace Shadowsocks.Util // // just kidding SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle, - (UIntPtr)0xFFFFFFFF, (UIntPtr)0xFFFFFFFF); + (UIntPtr)0xFFFFFFFF, + (UIntPtr)0xFFFFFFFF); } } @@ -87,7 +88,8 @@ namespace Shadowsocks.Util using (MemoryStream sb = new MemoryStream()) { using (GZipStream input = new GZipStream(new MemoryStream(buf), - CompressionMode.Decompress, false)) + CompressionMode.Decompress, + false)) { while ((n = input.Read(buffer, 0, buffer.Length)) > 0) { From 0cee110e5916979428a61b14e246340f66070722 Mon Sep 17 00:00:00 2001 From: kimw Date: Sun, 15 May 2016 01:44:03 -0400 Subject: [PATCH 2/7] renamed private properties with prefix underline --- .../Controller/Service/TCPRelay.cs | 170 +++++++++--------- 1 file changed, 80 insertions(+), 90 deletions(-) diff --git a/shadowsocks-csharp/Controller/Service/TCPRelay.cs b/shadowsocks-csharp/Controller/Service/TCPRelay.cs index 808f1f6f..888a2dd5 100644 --- a/shadowsocks-csharp/Controller/Service/TCPRelay.cs +++ b/shadowsocks-csharp/Controller/Service/TCPRelay.cs @@ -39,7 +39,7 @@ namespace Shadowsocks.Controller TCPHandler handler = new TCPHandler(this); handler.connection = socket; handler.controller = _controller; - handler.relay = this; + handler.tcprelay = this; handler.Start(firstPacket, length); IList handlersToClose = new List(); @@ -85,6 +85,11 @@ namespace Shadowsocks.Controller class TCPHandler { + // Size of receive buffer. + static public readonly int RecvSize = 8192; + static public readonly int RecvReserveSize = IVEncryptor.ONETIMEAUTH_BYTES + IVEncryptor.AUTH_BYTES; // reserve for one-time auth + static public readonly int BufferSize = RecvSize + RecvReserveSize + 32; + // public Encryptor encryptor; public IEncryptor encryptor; public Server server; @@ -92,51 +97,36 @@ namespace Shadowsocks.Controller public Socket remote; public Socket connection; public ShadowsocksController controller; - public TCPRelay relay; + public TCPRelay tcprelay; public DateTime lastActivity; - private const int maxRetry = 4; - private int retryCount = 0; - private bool connected; - - private byte command; + private const int _maxRetry = 4; + private int _retryCount = 0; + private bool _connected; + private byte _command; private byte[] _firstPacket; private int _firstPacketLength; - // Size of receive buffer. - public const int RecvSize = 8192; - public const int RecvReserveSize = IVEncryptor.ONETIMEAUTH_BYTES + IVEncryptor.AUTH_BYTES; // reserve for one-time auth - public const int BufferSize = RecvSize + RecvReserveSize + 32; - - private int totalRead = 0; - private int totalWrite = 0; - - // remote receive buffer - private byte[] remoteRecvBuffer = new byte[BufferSize]; - // remote send buffer - private byte[] remoteSendBuffer = new byte[BufferSize]; - // connection receive buffer - private byte[] connetionRecvBuffer = new byte[BufferSize]; - // connection send buffer - private byte[] connetionSendBuffer = new byte[BufferSize]; - // Received data string. - - private bool connectionShutdown = false; - private bool remoteShutdown = false; - private bool closed = false; - - private object encryptionLock = new object(); - private object decryptionLock = new object(); - + private int _totalRead = 0; + private int _totalWrite = 0; + private byte[] _remoteRecvBuffer = new byte[BufferSize]; + private byte[] _remoteSendBuffer = new byte[BufferSize]; + private byte[] _connetionRecvBuffer = new byte[BufferSize]; + private byte[] _connetionSendBuffer = new byte[BufferSize]; + private bool _connectionShutdown = false; + private bool _remoteShutdown = false; + private bool _closed = false; + private object _encryptionLock = new object(); + private object _decryptionLock = new object(); private DateTime _startConnectTime; private DateTime _startReceivingTime; private DateTime _startSendingTime; private int _bytesToSend; - private TCPRelay tcprelay; // TODO: tcprelay ?= relay + private TCPRelay _tcprelay; // TODO: is _tcprelay equals tcprelay declared above? public TCPHandler(TCPRelay tcprelay) { - this.tcprelay = tcprelay; + this._tcprelay = tcprelay; } public void CreateRemote() @@ -160,7 +150,7 @@ namespace Shadowsocks.Controller private void CheckClose() { - if (connectionShutdown && remoteShutdown) + if (_connectionShutdown && _remoteShutdown) { Close(); } @@ -168,17 +158,17 @@ namespace Shadowsocks.Controller public void Close() { - lock (relay.Handlers) + lock (tcprelay.Handlers) { - relay.Handlers.Remove(this); + tcprelay.Handlers.Remove(this); } lock (this) { - if (closed) + if (_closed) { return; } - closed = true; + _closed = true; } if (connection != null) { @@ -204,9 +194,9 @@ namespace Shadowsocks.Controller Logging.LogUsefulException(e); } } - lock (encryptionLock) + lock (_encryptionLock) { - lock (decryptionLock) + lock (_decryptionLock) { if (encryptor != null) { @@ -218,7 +208,7 @@ namespace Shadowsocks.Controller private void HandshakeReceive() { - if (closed) + if (_closed) { return; } @@ -251,7 +241,7 @@ namespace Shadowsocks.Controller private void HandshakeSendCallback(IAsyncResult ar) { - if (closed) + if (_closed) { return; } @@ -266,7 +256,7 @@ namespace Shadowsocks.Controller // +-----+-----+-------+------+----------+----------+ // Skip first 3 bytes // TODO validate - connection.BeginReceive(connetionRecvBuffer, 0, 3, 0, new AsyncCallback(handshakeReceive2Callback), null); + connection.BeginReceive(_connetionRecvBuffer, 0, 3, 0, new AsyncCallback(handshakeReceive2Callback), null); } catch (Exception e) { @@ -277,7 +267,7 @@ namespace Shadowsocks.Controller private void handshakeReceive2Callback(IAsyncResult ar) { - if (closed) + if (_closed) { return; } @@ -287,13 +277,13 @@ namespace Shadowsocks.Controller if (bytesRead >= 3) { - command = connetionRecvBuffer[1]; - if (command == 1) + _command = _connetionRecvBuffer[1]; + if (_command == 1) { byte[] response = { 5, 0, 0, 1, 0, 0, 0, 0, 0, 0 }; connection.BeginSend(response, 0, response.Length, 0, new AsyncCallback(ResponseCallback), null); } - else if (command == 3) + else if (_command == 3) { HandleUDPAssociate(); } @@ -334,7 +324,7 @@ namespace Shadowsocks.Controller private void ReadAll(IAsyncResult ar) { - if (closed) + if (_closed) { return; } @@ -344,7 +334,7 @@ namespace Shadowsocks.Controller { connection.EndSend(ar); Logging.Debug(remote, RecvSize, "TCP Relay"); - connection.BeginReceive(connetionRecvBuffer, 0, RecvSize, 0, new AsyncCallback(ReadAll), null); + connection.BeginReceive(_connetionRecvBuffer, 0, RecvSize, 0, new AsyncCallback(ReadAll), null); } else { @@ -352,7 +342,7 @@ namespace Shadowsocks.Controller if (bytesRead > 0) { Logging.Debug(remote, RecvSize, "TCP Relay"); - connection.BeginReceive(connetionRecvBuffer, 0, RecvSize, 0, new AsyncCallback(ReadAll), null); + connection.BeginReceive(_connetionRecvBuffer, 0, RecvSize, 0, new AsyncCallback(ReadAll), null); } else { @@ -417,7 +407,7 @@ namespace Shadowsocks.Controller connectTimer.Enabled = true; connectTimer.Server = server; - connected = false; + _connected = false; // Connect to the remote endpoint. remote.BeginConnect(remoteEP, new AsyncCallback(ConnectCallback), connectTimer); } @@ -430,7 +420,7 @@ namespace Shadowsocks.Controller private void connectTimer_Elapsed(object sender, ElapsedEventArgs e) { - if (connected) + if (_connected) { return; } @@ -447,11 +437,11 @@ namespace Shadowsocks.Controller private void RetryConnect() { - if (retryCount < maxRetry) + if (_retryCount < _maxRetry) { - Logging.Debug($"Connection failed, retry ({retryCount})"); + Logging.Debug($"Connection failed, retry ({_retryCount})"); StartConnect(); - retryCount++; + _retryCount++; } else { @@ -462,7 +452,7 @@ namespace Shadowsocks.Controller private void ConnectCallback(IAsyncResult ar) { Server server = null; - if (closed) + if (_closed) { return; } @@ -477,12 +467,12 @@ namespace Shadowsocks.Controller // Complete the connection. remote.EndConnect(ar); - connected = true; + _connected = true; var latency = DateTime.Now - _startConnectTime; IStrategy strategy = controller.GetCurrentStrategy(); strategy?.UpdateLatency(server, latency); - tcprelay.UpdateLatency(server, latency); + _tcprelay.UpdateLatency(server, latency); StartPipe(); } @@ -506,15 +496,15 @@ namespace Shadowsocks.Controller private void StartPipe() { - if (closed) + if (_closed) { return; } try { _startReceivingTime = DateTime.Now; - remote.BeginReceive(remoteRecvBuffer, 0, RecvSize, 0, new AsyncCallback(PipeRemoteReceiveCallback), null); - connection.BeginReceive(connetionRecvBuffer, 0, RecvSize, 0, new AsyncCallback(PipeConnectionReceiveCallback), null); + remote.BeginReceive(_remoteRecvBuffer, 0, RecvSize, 0, new AsyncCallback(PipeRemoteReceiveCallback), null); + connection.BeginReceive(_connetionRecvBuffer, 0, RecvSize, 0, new AsyncCallback(PipeConnectionReceiveCallback), null); } catch (Exception e) { @@ -525,29 +515,29 @@ namespace Shadowsocks.Controller private void PipeRemoteReceiveCallback(IAsyncResult ar) { - if (closed) + if (_closed) { return; } try { int bytesRead = remote.EndReceive(ar); - totalRead += bytesRead; - tcprelay.UpdateInboundCounter(server, bytesRead); + _totalRead += bytesRead; + _tcprelay.UpdateInboundCounter(server, bytesRead); if (bytesRead > 0) { lastActivity = DateTime.Now; int bytesToSend; - lock (decryptionLock) + lock (_decryptionLock) { - if (closed) + if (_closed) { return; } - encryptor.Decrypt(remoteRecvBuffer, bytesRead, remoteSendBuffer, out bytesToSend); + encryptor.Decrypt(_remoteRecvBuffer, bytesRead, _remoteSendBuffer, out bytesToSend); } - connection.BeginSend(remoteSendBuffer, 0, bytesToSend, 0, new AsyncCallback(PipeConnectionSendCallback), null); + connection.BeginSend(_remoteSendBuffer, 0, bytesToSend, 0, new AsyncCallback(PipeConnectionSendCallback), null); IStrategy strategy = controller.GetCurrentStrategy(); if (strategy != null) @@ -558,7 +548,7 @@ namespace Shadowsocks.Controller else { connection.Shutdown(SocketShutdown.Send); - connectionShutdown = true; + _connectionShutdown = true; CheckClose(); //if (totalRead == 0) @@ -578,52 +568,52 @@ namespace Shadowsocks.Controller private void PipeConnectionReceiveCallback(IAsyncResult ar) { - if (closed) + if (_closed) { return; } try { int bytesRead = connection.EndReceive(ar); - totalWrite += bytesRead; + _totalWrite += bytesRead; if (bytesRead > 0) { - int atyp = connetionRecvBuffer[0]; + int atyp = _connetionRecvBuffer[0]; string dst_addr; int dst_port; switch (atyp) { case 1: // IPv4 address, 4 bytes - dst_addr = new IPAddress(connetionRecvBuffer.Skip(1).Take(4).ToArray()).ToString(); - dst_port = (connetionRecvBuffer[5] << 8) + connetionRecvBuffer[6]; + dst_addr = new IPAddress(_connetionRecvBuffer.Skip(1).Take(4).ToArray()).ToString(); + dst_port = (_connetionRecvBuffer[5] << 8) + _connetionRecvBuffer[6]; Logging.Debug($"connect to {dst_addr}:{dst_port}"); break; case 3: // domain name, length + str - int len = connetionRecvBuffer[1]; - dst_addr = System.Text.Encoding.UTF8.GetString(connetionRecvBuffer, 2, len); - dst_port = (connetionRecvBuffer[len + 2] << 8) + connetionRecvBuffer[len + 3]; + int len = _connetionRecvBuffer[1]; + dst_addr = System.Text.Encoding.UTF8.GetString(_connetionRecvBuffer, 2, len); + dst_port = (_connetionRecvBuffer[len + 2] << 8) + _connetionRecvBuffer[len + 3]; Logging.Debug($"connect to {dst_addr}:{dst_port}"); break; case 4: // IPv6 address, 16 bytes - dst_addr = new IPAddress(connetionRecvBuffer.Skip(1).Take(16).ToArray()).ToString(); - dst_port = (connetionRecvBuffer[17] << 8) + connetionRecvBuffer[18]; + dst_addr = new IPAddress(_connetionRecvBuffer.Skip(1).Take(16).ToArray()).ToString(); + dst_port = (_connetionRecvBuffer[17] << 8) + _connetionRecvBuffer[18]; Logging.Debug($"connect to [{dst_addr}]:{dst_port}"); break; } int bytesToSend; - lock (encryptionLock) + lock (_encryptionLock) { - if (closed) + if (_closed) { return; } - encryptor.Encrypt(connetionRecvBuffer, bytesRead, connetionSendBuffer, out bytesToSend); + encryptor.Encrypt(_connetionRecvBuffer, bytesRead, _connetionSendBuffer, out bytesToSend); } - tcprelay.UpdateOutboundCounter(server, bytesToSend); + _tcprelay.UpdateOutboundCounter(server, bytesToSend); _startSendingTime = DateTime.Now; _bytesToSend = bytesToSend; - remote.BeginSend(connetionSendBuffer, 0, bytesToSend, 0, new AsyncCallback(PipeRemoteSendCallback), null); + remote.BeginSend(_connetionSendBuffer, 0, bytesToSend, 0, new AsyncCallback(PipeRemoteSendCallback), null); IStrategy strategy = controller.GetCurrentStrategy(); strategy?.UpdateLastWrite(server); @@ -631,7 +621,7 @@ namespace Shadowsocks.Controller else { remote.Shutdown(SocketShutdown.Send); - remoteShutdown = true; + _remoteShutdown = true; CheckClose(); } } @@ -644,14 +634,14 @@ namespace Shadowsocks.Controller private void PipeRemoteSendCallback(IAsyncResult ar) { - if (closed) + if (_closed) { return; } try { remote.EndSend(ar); - connection.BeginReceive(connetionRecvBuffer, 0, RecvSize, 0, new AsyncCallback(PipeConnectionReceiveCallback), null); + connection.BeginReceive(_connetionRecvBuffer, 0, RecvSize, 0, new AsyncCallback(PipeConnectionReceiveCallback), null); } catch (Exception e) { @@ -662,14 +652,14 @@ namespace Shadowsocks.Controller private void PipeConnectionSendCallback(IAsyncResult ar) { - if (closed) + if (_closed) { return; } try { connection.EndSend(ar); - remote.BeginReceive(remoteRecvBuffer, 0, RecvSize, 0, new AsyncCallback(PipeRemoteReceiveCallback), null); + remote.BeginReceive(_remoteRecvBuffer, 0, RecvSize, 0, new AsyncCallback(PipeRemoteReceiveCallback), null); } catch (Exception e) { From ff04a2a18af99a936854581c7262c84fcbe3a843 Mon Sep 17 00:00:00 2001 From: kimw Date: Sun, 15 May 2016 02:04:04 -0400 Subject: [PATCH 3/7] clean up code in C# 6 --- .../Controller/Service/TCPRelay.cs | 222 ++++++------------ 1 file changed, 67 insertions(+), 155 deletions(-) diff --git a/shadowsocks-csharp/Controller/Service/TCPRelay.cs b/shadowsocks-csharp/Controller/Service/TCPRelay.cs index 888a2dd5..0e0c78fd 100644 --- a/shadowsocks-csharp/Controller/Service/TCPRelay.cs +++ b/shadowsocks-csharp/Controller/Service/TCPRelay.cs @@ -27,44 +27,38 @@ namespace Shadowsocks.Controller public bool Handle(byte[] firstPacket, int length, Socket socket, object state) { - if (socket.ProtocolType != ProtocolType.Tcp) - { + if (socket.ProtocolType != ProtocolType.Tcp + || (length < 2 || firstPacket[0] != 5)) return false; - } - if (length < 2 || firstPacket[0] != 5) + else { - return false; - } - socket.SetSocketOption(SocketOptionLevel.Tcp, SocketOptionName.NoDelay, true); - TCPHandler handler = new TCPHandler(this); - handler.connection = socket; - handler.controller = _controller; - handler.tcprelay = this; + socket.SetSocketOption(SocketOptionLevel.Tcp, SocketOptionName.NoDelay, true); + TCPHandler handler = new TCPHandler(this); + handler.connection = socket; + handler.controller = _controller; + handler.tcprelay = this; - handler.Start(firstPacket, length); - IList handlersToClose = new List(); - lock (Handlers) - { - Handlers.Add(handler); - DateTime now = DateTime.Now; - if (now - _lastSweepTime > TimeSpan.FromSeconds(1)) + handler.Start(firstPacket, length); + IList handlersToClose = new List(); + lock (Handlers) { - _lastSweepTime = now; - foreach (TCPHandler handler1 in Handlers) + Handlers.Add(handler); + DateTime now = DateTime.Now; + if (now - _lastSweepTime > TimeSpan.FromSeconds(1)) { - if (now - handler1.lastActivity > TimeSpan.FromSeconds(900)) - { - handlersToClose.Add(handler1); - } + _lastSweepTime = now; + foreach (TCPHandler handler1 in Handlers) + if (now - handler1.lastActivity > TimeSpan.FromSeconds(900)) + handlersToClose.Add(handler1); } } + foreach (TCPHandler handler1 in handlersToClose) + { + Logging.Debug("Closing timed out TCP connection."); + handler1.Close(); + } + return true; } - foreach (TCPHandler handler1 in handlersToClose) - { - Logging.Debug("Closing timed out TCP connection."); - handler1.Close(); - } - return true; } public void UpdateInboundCounter(Server server, long n) @@ -126,16 +120,14 @@ namespace Shadowsocks.Controller public TCPHandler(TCPRelay tcprelay) { - this._tcprelay = tcprelay; + _tcprelay = tcprelay; } public void CreateRemote() { Server server = controller.GetAServer(IStrategyCallerType.TCP, (IPEndPoint)connection.RemoteEndPoint); if (server == null || server.server == "") - { throw new ArgumentException("No server configured"); - } encryptor = EncryptorFactory.GetEncryptor(server.method, server.password, server.auth, false); this.server = server; } @@ -151,9 +143,7 @@ namespace Shadowsocks.Controller private void CheckClose() { if (_connectionShutdown && _remoteShutdown) - { Close(); - } } public void Close() @@ -165,57 +155,43 @@ namespace Shadowsocks.Controller lock (this) { if (_closed) - { return; - } - _closed = true; + else + _closed = true; } - if (connection != null) + try { - try - { - connection.Shutdown(SocketShutdown.Both); - connection.Close(); - } - catch (Exception e) - { - Logging.LogUsefulException(e); - } + connection?.Shutdown(SocketShutdown.Both); + connection?.Close(); } - if (remote != null) + catch (Exception e) { - try - { - remote.Shutdown(SocketShutdown.Both); - remote.Close(); - } - catch (Exception e) - { - Logging.LogUsefulException(e); - } + Logging.LogUsefulException(e); + } + try + { + remote?.Shutdown(SocketShutdown.Both); + remote?.Close(); + } + catch (Exception e) + { + Logging.LogUsefulException(e); } lock (_encryptionLock) { lock (_decryptionLock) { - if (encryptor != null) - { - ((IDisposable)encryptor).Dispose(); - } + encryptor?.Dispose(); } } } private void HandshakeReceive() { - if (_closed) - { - return; - } + if (_closed) return; try { int bytesRead = _firstPacketLength; - if (bytesRead > 1) { byte[] response = { 5, 0 }; @@ -228,9 +204,7 @@ namespace Shadowsocks.Controller connection.BeginSend(response, 0, response.Length, 0, new AsyncCallback(HandshakeSendCallback), null); } else - { Close(); - } } catch (Exception e) { @@ -241,10 +215,7 @@ namespace Shadowsocks.Controller private void HandshakeSendCallback(IAsyncResult ar) { - if (_closed) - { - return; - } + if (_closed) return; try { connection.EndSend(ar); @@ -267,14 +238,10 @@ namespace Shadowsocks.Controller private void handshakeReceive2Callback(IAsyncResult ar) { - if (_closed) - { - return; - } + if (_closed) return; try { int bytesRead = connection.EndReceive(ar); - if (bytesRead >= 3) { _command = _connetionRecvBuffer[1]; @@ -284,9 +251,7 @@ namespace Shadowsocks.Controller connection.BeginSend(response, 0, response.Length, 0, new AsyncCallback(ResponseCallback), null); } else if (_command == 3) - { HandleUDPAssociate(); - } } else { @@ -308,13 +273,14 @@ namespace Shadowsocks.Controller int port = endPoint.Port; byte[] response = new byte[4 + address.Length + 2]; response[0] = 5; - if (endPoint.AddressFamily == AddressFamily.InterNetwork) - { - response[3] = 1; - } - else if (endPoint.AddressFamily == AddressFamily.InterNetworkV6) + switch (endPoint.AddressFamily) { - response[3] = 4; + case AddressFamily.InterNetwork: + response[3] = 1; + break; + case AddressFamily.InterNetworkV6: + response[3] = 4; + break; } address.CopyTo(response, 4); response[response.Length - 1] = (byte)(port & 0xFF); @@ -324,10 +290,7 @@ namespace Shadowsocks.Controller private void ReadAll(IAsyncResult ar) { - if (_closed) - { - return; - } + if (_closed) return; try { if (ar.AsyncState != null) @@ -345,9 +308,7 @@ namespace Shadowsocks.Controller connection.BeginReceive(_connetionRecvBuffer, 0, RecvSize, 0, new AsyncCallback(ReadAll), null); } else - { Close(); - } } } catch (Exception e) @@ -362,10 +323,8 @@ namespace Shadowsocks.Controller try { connection.EndSend(ar); - StartConnect(); } - catch (Exception e) { Logging.LogUsefulException(e); @@ -396,8 +355,7 @@ namespace Shadowsocks.Controller } IPEndPoint remoteEP = new IPEndPoint(ipAddress, server.server_port); - remote = new Socket(ipAddress.AddressFamily, - SocketType.Stream, ProtocolType.Tcp); + remote = new Socket(ipAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp); remote.SetSocketOption(SocketOptionLevel.Tcp, SocketOptionName.NoDelay, true); _startConnectTime = DateTime.Now; @@ -420,16 +378,10 @@ namespace Shadowsocks.Controller private void connectTimer_Elapsed(object sender, ElapsedEventArgs e) { - if (_connected) - { - return; - } + if (_connected) return; Server server = ((ServerTimer)sender).Server; IStrategy strategy = controller.GetCurrentStrategy(); - if (strategy != null) - { - strategy.SetFailure(server); - } + strategy?.SetFailure(server); Logging.Info($"{server.FriendlyName()} timed out"); remote.Close(); RetryConnect(); @@ -444,22 +396,16 @@ namespace Shadowsocks.Controller _retryCount++; } else - { Close(); - } } private void ConnectCallback(IAsyncResult ar) { - Server server = null; - if (_closed) - { - return; - } + if (_closed) return; try { ServerTimer timer = (ServerTimer)ar.AsyncState; - server = timer.Server; + Server server = timer.Server; timer.Elapsed -= connectTimer_Elapsed; timer.Enabled = false; timer.Dispose(); @@ -484,10 +430,7 @@ namespace Shadowsocks.Controller if (server != null) { IStrategy strategy = controller.GetCurrentStrategy(); - if (strategy != null) - { - strategy.SetFailure(server); - } + strategy?.SetFailure(server); } Logging.LogUsefulException(e); RetryConnect(); @@ -496,10 +439,7 @@ namespace Shadowsocks.Controller private void StartPipe() { - if (_closed) - { - return; - } + if (_closed) return; try { _startReceivingTime = DateTime.Now; @@ -515,10 +455,7 @@ namespace Shadowsocks.Controller private void PipeRemoteReceiveCallback(IAsyncResult ar) { - if (_closed) - { - return; - } + if (_closed) return; try { int bytesRead = remote.EndReceive(ar); @@ -531,32 +468,19 @@ namespace Shadowsocks.Controller int bytesToSend; lock (_decryptionLock) { - if (_closed) - { - return; - } + if (_closed) return; encryptor.Decrypt(_remoteRecvBuffer, bytesRead, _remoteSendBuffer, out bytesToSend); } connection.BeginSend(_remoteSendBuffer, 0, bytesToSend, 0, new AsyncCallback(PipeConnectionSendCallback), null); IStrategy strategy = controller.GetCurrentStrategy(); - if (strategy != null) - { - strategy.UpdateLastRead(server); - } + strategy?.UpdateLastRead(server); } else { connection.Shutdown(SocketShutdown.Send); _connectionShutdown = true; CheckClose(); - - //if (totalRead == 0) - //{ - // // closed before anything received, reports as failure - // // disable this feature - // controller.GetCurrentStrategy().SetFailure(this.server); - //} } } catch (Exception e) @@ -568,10 +492,7 @@ namespace Shadowsocks.Controller private void PipeConnectionReceiveCallback(IAsyncResult ar) { - if (_closed) - { - return; - } + if (_closed) return; try { int bytesRead = connection.EndReceive(ar); @@ -604,10 +525,7 @@ namespace Shadowsocks.Controller int bytesToSend; lock (_encryptionLock) { - if (_closed) - { - return; - } + if (_closed) return; encryptor.Encrypt(_connetionRecvBuffer, bytesRead, _connetionSendBuffer, out bytesToSend); } _tcprelay.UpdateOutboundCounter(server, bytesToSend); @@ -634,10 +552,7 @@ namespace Shadowsocks.Controller private void PipeRemoteSendCallback(IAsyncResult ar) { - if (_closed) - { - return; - } + if (_closed) return; try { remote.EndSend(ar); @@ -652,10 +567,7 @@ namespace Shadowsocks.Controller private void PipeConnectionSendCallback(IAsyncResult ar) { - if (_closed) - { - return; - } + if (_closed) return; try { connection.EndSend(ar); From f9296b49b12cbfe945e643c05aa2dd71869bbc44 Mon Sep 17 00:00:00 2001 From: kimw Date: Sun, 15 May 2016 02:17:05 -0400 Subject: [PATCH 4/7] clean up buggy parameter. Replaced SocketFlags.None (an enum which euqals 0) from zero. --- .../Controller/Service/TCPRelay.cs | 29 ++++++++----------- 1 file changed, 12 insertions(+), 17 deletions(-) diff --git a/shadowsocks-csharp/Controller/Service/TCPRelay.cs b/shadowsocks-csharp/Controller/Service/TCPRelay.cs index 0e0c78fd..28d7ee8b 100644 --- a/shadowsocks-csharp/Controller/Service/TCPRelay.cs +++ b/shadowsocks-csharp/Controller/Service/TCPRelay.cs @@ -37,7 +37,6 @@ namespace Shadowsocks.Controller handler.connection = socket; handler.controller = _controller; handler.tcprelay = this; - handler.Start(firstPacket, length); IList handlersToClose = new List(); lock (Handlers) @@ -201,7 +200,7 @@ namespace Shadowsocks.Controller response = new byte[] { 0, 91 }; Logging.Error("socks 5 protocol error"); } - connection.BeginSend(response, 0, response.Length, 0, new AsyncCallback(HandshakeSendCallback), null); + connection.BeginSend(response, 0, response.Length, SocketFlags.None, new AsyncCallback(HandshakeSendCallback), null); } else Close(); @@ -227,7 +226,7 @@ namespace Shadowsocks.Controller // +-----+-----+-------+------+----------+----------+ // Skip first 3 bytes // TODO validate - connection.BeginReceive(_connetionRecvBuffer, 0, 3, 0, new AsyncCallback(handshakeReceive2Callback), null); + connection.BeginReceive(_connetionRecvBuffer, 0, 3, SocketFlags.None, new AsyncCallback(handshakeReceive2Callback), null); } catch (Exception e) { @@ -248,7 +247,7 @@ namespace Shadowsocks.Controller if (_command == 1) { byte[] response = { 5, 0, 0, 1, 0, 0, 0, 0, 0, 0 }; - connection.BeginSend(response, 0, response.Length, 0, new AsyncCallback(ResponseCallback), null); + connection.BeginSend(response, 0, response.Length, SocketFlags.None, new AsyncCallback(ResponseCallback), null); } else if (_command == 3) HandleUDPAssociate(); @@ -285,7 +284,7 @@ namespace Shadowsocks.Controller address.CopyTo(response, 4); response[response.Length - 1] = (byte)(port & 0xFF); response[response.Length - 2] = (byte)((port >> 8) & 0xFF); - connection.BeginSend(response, 0, response.Length, 0, new AsyncCallback(ReadAll), true); + connection.BeginSend(response, 0, response.Length, SocketFlags.None, new AsyncCallback(ReadAll), true); } private void ReadAll(IAsyncResult ar) @@ -297,7 +296,7 @@ namespace Shadowsocks.Controller { connection.EndSend(ar); Logging.Debug(remote, RecvSize, "TCP Relay"); - connection.BeginReceive(_connetionRecvBuffer, 0, RecvSize, 0, new AsyncCallback(ReadAll), null); + connection.BeginReceive(_connetionRecvBuffer, 0, RecvSize, SocketFlags.None, new AsyncCallback(ReadAll), null); } else { @@ -305,7 +304,7 @@ namespace Shadowsocks.Controller if (bytesRead > 0) { Logging.Debug(remote, RecvSize, "TCP Relay"); - connection.BeginReceive(_connetionRecvBuffer, 0, RecvSize, 0, new AsyncCallback(ReadAll), null); + connection.BeginReceive(_connetionRecvBuffer, 0, RecvSize, SocketFlags.None, new AsyncCallback(ReadAll), null); } else Close(); @@ -443,8 +442,8 @@ namespace Shadowsocks.Controller try { _startReceivingTime = DateTime.Now; - remote.BeginReceive(_remoteRecvBuffer, 0, RecvSize, 0, new AsyncCallback(PipeRemoteReceiveCallback), null); - connection.BeginReceive(_connetionRecvBuffer, 0, RecvSize, 0, new AsyncCallback(PipeConnectionReceiveCallback), null); + remote.BeginReceive(_remoteRecvBuffer, 0, RecvSize, SocketFlags.None, new AsyncCallback(PipeRemoteReceiveCallback), null); + connection.BeginReceive(_connetionRecvBuffer, 0, RecvSize, SocketFlags.None, new AsyncCallback(PipeConnectionReceiveCallback), null); } catch (Exception e) { @@ -461,7 +460,6 @@ namespace Shadowsocks.Controller int bytesRead = remote.EndReceive(ar); _totalRead += bytesRead; _tcprelay.UpdateInboundCounter(server, bytesRead); - if (bytesRead > 0) { lastActivity = DateTime.Now; @@ -471,8 +469,7 @@ namespace Shadowsocks.Controller if (_closed) return; encryptor.Decrypt(_remoteRecvBuffer, bytesRead, _remoteSendBuffer, out bytesToSend); } - connection.BeginSend(_remoteSendBuffer, 0, bytesToSend, 0, new AsyncCallback(PipeConnectionSendCallback), null); - + connection.BeginSend(_remoteSendBuffer, 0, bytesToSend, SocketFlags.None, new AsyncCallback(PipeConnectionSendCallback), null); IStrategy strategy = controller.GetCurrentStrategy(); strategy?.UpdateLastRead(server); } @@ -497,7 +494,6 @@ namespace Shadowsocks.Controller { int bytesRead = connection.EndReceive(ar); _totalWrite += bytesRead; - if (bytesRead > 0) { int atyp = _connetionRecvBuffer[0]; @@ -531,8 +527,7 @@ namespace Shadowsocks.Controller _tcprelay.UpdateOutboundCounter(server, bytesToSend); _startSendingTime = DateTime.Now; _bytesToSend = bytesToSend; - remote.BeginSend(_connetionSendBuffer, 0, bytesToSend, 0, new AsyncCallback(PipeRemoteSendCallback), null); - + remote.BeginSend(_connetionSendBuffer, 0, bytesToSend, SocketFlags.None, new AsyncCallback(PipeRemoteSendCallback), null); IStrategy strategy = controller.GetCurrentStrategy(); strategy?.UpdateLastWrite(server); } @@ -556,7 +551,7 @@ namespace Shadowsocks.Controller try { remote.EndSend(ar); - connection.BeginReceive(_connetionRecvBuffer, 0, RecvSize, 0, new AsyncCallback(PipeConnectionReceiveCallback), null); + connection.BeginReceive(_connetionRecvBuffer, 0, RecvSize, SocketFlags.None, new AsyncCallback(PipeConnectionReceiveCallback), null); } catch (Exception e) { @@ -571,7 +566,7 @@ namespace Shadowsocks.Controller try { connection.EndSend(ar); - remote.BeginReceive(_remoteRecvBuffer, 0, RecvSize, 0, new AsyncCallback(PipeRemoteReceiveCallback), null); + remote.BeginReceive(_remoteRecvBuffer, 0, RecvSize, SocketFlags.None, new AsyncCallback(PipeRemoteReceiveCallback), null); } catch (Exception e) { From f21c5347043e64c1a6516b7ad046e8e0e81d1bc6 Mon Sep 17 00:00:00 2001 From: Syrone Wong Date: Fri, 5 Aug 2016 16:31:05 +0800 Subject: [PATCH 5/7] minor changes Signed-off-by: Syrone Wong --- .../Controller/Service/TCPRelay.cs | 70 ++++++++++--------- 1 file changed, 36 insertions(+), 34 deletions(-) diff --git a/shadowsocks-csharp/Controller/Service/TCPRelay.cs b/shadowsocks-csharp/Controller/Service/TCPRelay.cs index 28d7ee8b..4f538573 100644 --- a/shadowsocks-csharp/Controller/Service/TCPRelay.cs +++ b/shadowsocks-csharp/Controller/Service/TCPRelay.cs @@ -30,34 +30,32 @@ namespace Shadowsocks.Controller if (socket.ProtocolType != ProtocolType.Tcp || (length < 2 || firstPacket[0] != 5)) return false; - else - { - socket.SetSocketOption(SocketOptionLevel.Tcp, SocketOptionName.NoDelay, true); - TCPHandler handler = new TCPHandler(this); - handler.connection = socket; - handler.controller = _controller; - handler.tcprelay = this; - handler.Start(firstPacket, length); - IList handlersToClose = new List(); - lock (Handlers) - { - Handlers.Add(handler); - DateTime now = DateTime.Now; - if (now - _lastSweepTime > TimeSpan.FromSeconds(1)) - { - _lastSweepTime = now; - foreach (TCPHandler handler1 in Handlers) - if (now - handler1.lastActivity > TimeSpan.FromSeconds(900)) - handlersToClose.Add(handler1); - } - } - foreach (TCPHandler handler1 in handlersToClose) + socket.SetSocketOption(SocketOptionLevel.Tcp, SocketOptionName.NoDelay, true); + TCPHandler handler = new TCPHandler(this); + handler.connection = socket; + handler.controller = _controller; + handler.tcprelay = this; + + handler.Start(firstPacket, length); + IList handlersToClose = new List(); + lock (Handlers) + { + Handlers.Add(handler); + DateTime now = DateTime.Now; + if (now - _lastSweepTime > TimeSpan.FromSeconds(1)) { - Logging.Debug("Closing timed out TCP connection."); - handler1.Close(); + _lastSweepTime = now; + foreach (TCPHandler handler1 in Handlers) + if (now - handler1.lastActivity > TimeSpan.FromSeconds(900)) + handlersToClose.Add(handler1); } - return true; } + foreach (TCPHandler handler1 in handlersToClose) + { + Logging.Debug("Closing timed out TCP connection."); + handler1.Close(); + } + return true; } public void UpdateInboundCounter(Server server, long n) @@ -79,9 +77,9 @@ namespace Shadowsocks.Controller class TCPHandler { // Size of receive buffer. - static public readonly int RecvSize = 8192; - static public readonly int RecvReserveSize = IVEncryptor.ONETIMEAUTH_BYTES + IVEncryptor.AUTH_BYTES; // reserve for one-time auth - static public readonly int BufferSize = RecvSize + RecvReserveSize + 32; + public static readonly int RecvSize = 8192; + public static readonly int RecvReserveSize = IVEncryptor.ONETIMEAUTH_BYTES + IVEncryptor.AUTH_BYTES; // reserve for one-time auth + public static readonly int BufferSize = RecvSize + RecvReserveSize + 32; // public Encryptor encryptor; public IEncryptor encryptor; @@ -97,20 +95,26 @@ namespace Shadowsocks.Controller private const int _maxRetry = 4; private int _retryCount = 0; private bool _connected; + private byte _command; private byte[] _firstPacket; private int _firstPacketLength; + private int _totalRead = 0; private int _totalWrite = 0; + private byte[] _remoteRecvBuffer = new byte[BufferSize]; private byte[] _remoteSendBuffer = new byte[BufferSize]; private byte[] _connetionRecvBuffer = new byte[BufferSize]; private byte[] _connetionSendBuffer = new byte[BufferSize]; + private bool _connectionShutdown = false; private bool _remoteShutdown = false; private bool _closed = false; + private object _encryptionLock = new object(); private object _decryptionLock = new object(); + private DateTime _startConnectTime; private DateTime _startReceivingTime; private DateTime _startSendingTime; @@ -151,12 +155,9 @@ namespace Shadowsocks.Controller { tcprelay.Handlers.Remove(this); } - lock (this) - { - if (_closed) - return; - else - _closed = true; + lock (this) { + if (_closed) return; + _closed = true; } try { @@ -504,6 +505,7 @@ namespace Shadowsocks.Controller case 1: // IPv4 address, 4 bytes dst_addr = new IPAddress(_connetionRecvBuffer.Skip(1).Take(4).ToArray()).ToString(); dst_port = (_connetionRecvBuffer[5] << 8) + _connetionRecvBuffer[6]; + // Note by wongsyrone: this will be stripped out in Release version Logging.Debug($"connect to {dst_addr}:{dst_port}"); break; case 3: // domain name, length + str From fb3fcdb90d68ad6e8c582ecb5d70c26103017fe4 Mon Sep 17 00:00:00 2001 From: Syrone Wong Date: Mon, 8 Aug 2016 10:33:17 +0800 Subject: [PATCH 6/7] Add verbose logging to log every connection Note: - Added a configuration entry, user should add this by hand or reset from scratch. Signed-off-by: Syrone Wong --- shadowsocks-csharp/Controller/Service/TCPRelay.cs | 13 +++++++++---- .../Controller/ShadowsocksController.cs | 10 ++++++++++ shadowsocks-csharp/Data/cn.txt | 1 + shadowsocks-csharp/Model/Configuration.cs | 1 + shadowsocks-csharp/View/MenuViewController.cs | 13 +++++++++++++ 5 files changed, 34 insertions(+), 4 deletions(-) diff --git a/shadowsocks-csharp/Controller/Service/TCPRelay.cs b/shadowsocks-csharp/Controller/Service/TCPRelay.cs index 4f538573..86951ccc 100644 --- a/shadowsocks-csharp/Controller/Service/TCPRelay.cs +++ b/shadowsocks-csharp/Controller/Service/TCPRelay.cs @@ -505,19 +505,24 @@ namespace Shadowsocks.Controller case 1: // IPv4 address, 4 bytes dst_addr = new IPAddress(_connetionRecvBuffer.Skip(1).Take(4).ToArray()).ToString(); dst_port = (_connetionRecvBuffer[5] << 8) + _connetionRecvBuffer[6]; - // Note by wongsyrone: this will be stripped out in Release version - Logging.Debug($"connect to {dst_addr}:{dst_port}"); + if ( controller.GetCurrentConfiguration().isVerboseLogging ) { + Logging.Info( $"connect to {dst_addr}:{dst_port}" ); + } break; case 3: // domain name, length + str int len = _connetionRecvBuffer[1]; dst_addr = System.Text.Encoding.UTF8.GetString(_connetionRecvBuffer, 2, len); dst_port = (_connetionRecvBuffer[len + 2] << 8) + _connetionRecvBuffer[len + 3]; - Logging.Debug($"connect to {dst_addr}:{dst_port}"); + if ( controller.GetCurrentConfiguration().isVerboseLogging ) { + Logging.Info( $"connect to {dst_addr}:{dst_port}" ); + } break; case 4: // IPv6 address, 16 bytes dst_addr = new IPAddress(_connetionRecvBuffer.Skip(1).Take(16).ToArray()).ToString(); dst_port = (_connetionRecvBuffer[17] << 8) + _connetionRecvBuffer[18]; - Logging.Debug($"connect to [{dst_addr}]:{dst_port}"); + if ( controller.GetCurrentConfiguration().isVerboseLogging ) { + Logging.Info( $"connect to [{dst_addr}]:{dst_port}" ); + } break; } int bytesToSend; diff --git a/shadowsocks-csharp/Controller/ShadowsocksController.cs b/shadowsocks-csharp/Controller/ShadowsocksController.cs index 8023f51f..6bf8de24 100755 --- a/shadowsocks-csharp/Controller/ShadowsocksController.cs +++ b/shadowsocks-csharp/Controller/ShadowsocksController.cs @@ -68,6 +68,7 @@ namespace Shadowsocks.Controller public event EventHandler EnableStatusChanged; public event EventHandler EnableGlobalChanged; public event EventHandler ShareOverLANStatusChanged; + public event EventHandler VerboseLoggingStatusChanged; public event EventHandler TrafficChanged; // when user clicked Edit PAC, and PAC file has already created @@ -212,6 +213,15 @@ namespace Shadowsocks.Controller } } + public void ToggleVerboseLogging(bool enabled) + { + _config.isVerboseLogging = enabled; + SaveConfig(_config); + if ( VerboseLoggingStatusChanged != null ) { + VerboseLoggingStatusChanged(this, new EventArgs()); + } + } + public void SelectServerIndex(int index) { _config.index = index; diff --git a/shadowsocks-csharp/Data/cn.txt b/shadowsocks-csharp/Data/cn.txt index 30f51f20..33c9eb2c 100644 --- a/shadowsocks-csharp/Data/cn.txt +++ b/shadowsocks-csharp/Data/cn.txt @@ -22,6 +22,7 @@ Show QRCode...=显示二维码... Scan QRCode from Screen...=扫描屏幕上的二维码... Availability Statistics=统计可用性 Show Logs...=显示日志... +Verbose Logging=详细记录日志 Updates...=更新... Check for Updates...=检查更新 Check for Updates at Startup=启动时检查更新 diff --git a/shadowsocks-csharp/Model/Configuration.cs b/shadowsocks-csharp/Model/Configuration.cs index 10a42124..91c95871 100755 --- a/shadowsocks-csharp/Model/Configuration.cs +++ b/shadowsocks-csharp/Model/Configuration.cs @@ -24,6 +24,7 @@ namespace Shadowsocks.Model public bool useOnlinePac; public bool availabilityStatistics; public bool autoCheckUpdate; + public bool isVerboseLogging; public LogViewerConfig logViewer; private static string CONFIG_FILE = "gui-config.json"; diff --git a/shadowsocks-csharp/View/MenuViewController.cs b/shadowsocks-csharp/View/MenuViewController.cs index 3a5e5367..42f0fa48 100755 --- a/shadowsocks-csharp/View/MenuViewController.cs +++ b/shadowsocks-csharp/View/MenuViewController.cs @@ -48,6 +48,7 @@ namespace Shadowsocks.View private MenuItem editGFWUserRuleItem; private MenuItem editOnlinePACItem; private MenuItem autoCheckUpdatesToggleItem; + private MenuItem VerboseLoggingToggleItem; private ConfigForm configForm; private List logForms = new List(); private bool logFormsVisible = false; @@ -64,6 +65,7 @@ namespace Shadowsocks.View controller.PACFileReadyToOpen += controller_FileReadyToOpen; controller.UserRuleFileReadyToOpen += controller_FileReadyToOpen; controller.ShareOverLANStatusChanged += controller_ShareOverLANStatusChanged; + controller.VerboseLoggingStatusChanged += controller_VerboseLoggingStatusChanged; controller.EnableGlobalChanged += controller_EnableGlobalChanged; controller.Errored += controller_Errored; controller.UpdatePACFromGFWListCompleted += controller_UpdatePACFromGFWListCompleted; @@ -265,6 +267,7 @@ namespace Shadowsocks.View this.ShareOverLANItem = CreateMenuItem("Allow Clients from LAN", new EventHandler(this.ShareOverLANItem_Click)), new MenuItem("-"), CreateMenuItem("Show Logs...", new EventHandler(this.ShowLogItem_Click)), + this.VerboseLoggingToggleItem = CreateMenuItem( "Verbose Logging", new EventHandler(this.VerboseLoggingToggleItem_Click) ), CreateMenuGroup("Updates...", new MenuItem[] { CreateMenuItem("Check for Updates...", new EventHandler(this.checkUpdatesItem_Click)), new MenuItem("-"), @@ -293,6 +296,10 @@ namespace Shadowsocks.View ShareOverLANItem.Checked = controller.GetConfigurationCopy().shareOverLan; } + void controller_VerboseLoggingStatusChanged(object sender, EventArgs e) { + VerboseLoggingToggleItem.Checked = controller.GetConfigurationCopy().isVerboseLogging; + } + void controller_EnableGlobalChanged(object sender, EventArgs e) { globalModeItem.Checked = controller.GetConfigurationCopy().global; @@ -369,6 +376,7 @@ namespace Shadowsocks.View globalModeItem.Checked = config.global; PACModeItem.Checked = !config.global; ShareOverLANItem.Checked = config.shareOverLan; + VerboseLoggingToggleItem.Checked = config.isVerboseLogging; AutoStartupItem.Checked = AutoStartup.Check(); onlinePACItem.Checked = onlinePACItem.Enabled && config.useOnlinePac; localPACItem.Checked = !onlinePACItem.Checked; @@ -576,6 +584,11 @@ namespace Shadowsocks.View logForms.Add(f); } + private void VerboseLoggingToggleItem_Click( object sender, EventArgs e ) { + VerboseLoggingToggleItem.Checked = ! VerboseLoggingToggleItem.Checked; + controller.ToggleVerboseLogging( VerboseLoggingToggleItem.Checked ); + } + private void StatisticsConfigItem_Click(object sender, EventArgs e) { StatisticsStrategyConfigurationForm form = new StatisticsStrategyConfigurationForm(controller); From d3acb3e681b12085e5a4399547aee074853aa66f Mon Sep 17 00:00:00 2001 From: Syrone Wong Date: Mon, 8 Aug 2016 15:36:04 +0800 Subject: [PATCH 7/7] Refine verbose logging handling I can't wait until PR #604 get merged, do it manually. Signed-off-by: Syrone Wong --- .../Controller/Service/TCPRelay.cs | 16 ++++++++++------ .../Controller/ShadowsocksController.cs | 2 +- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/shadowsocks-csharp/Controller/Service/TCPRelay.cs b/shadowsocks-csharp/Controller/Service/TCPRelay.cs index 86951ccc..00edc00f 100644 --- a/shadowsocks-csharp/Controller/Service/TCPRelay.cs +++ b/shadowsocks-csharp/Controller/Service/TCPRelay.cs @@ -15,12 +15,14 @@ namespace Shadowsocks.Controller { private ShadowsocksController _controller; private DateTime _lastSweepTime; + private Configuration _config; public ISet Handlers { get; set; } - public TCPRelay(ShadowsocksController controller) + public TCPRelay(ShadowsocksController controller, Configuration conf) { _controller = controller; + _config = conf; Handlers = new HashSet(); _lastSweepTime = DateTime.Now; } @@ -31,7 +33,7 @@ namespace Shadowsocks.Controller || (length < 2 || firstPacket[0] != 5)) return false; socket.SetSocketOption(SocketOptionLevel.Tcp, SocketOptionName.NoDelay, true); - TCPHandler handler = new TCPHandler(this); + TCPHandler handler = new TCPHandler(this, _config); handler.connection = socket; handler.controller = _controller; handler.tcprelay = this; @@ -120,10 +122,12 @@ namespace Shadowsocks.Controller private DateTime _startSendingTime; private int _bytesToSend; private TCPRelay _tcprelay; // TODO: is _tcprelay equals tcprelay declared above? + private Configuration _config; - public TCPHandler(TCPRelay tcprelay) + public TCPHandler(TCPRelay tcprelay, Configuration config) { _tcprelay = tcprelay; + _config = config; } public void CreateRemote() @@ -505,7 +509,7 @@ namespace Shadowsocks.Controller case 1: // IPv4 address, 4 bytes dst_addr = new IPAddress(_connetionRecvBuffer.Skip(1).Take(4).ToArray()).ToString(); dst_port = (_connetionRecvBuffer[5] << 8) + _connetionRecvBuffer[6]; - if ( controller.GetCurrentConfiguration().isVerboseLogging ) { + if ( _config.isVerboseLogging ) { Logging.Info( $"connect to {dst_addr}:{dst_port}" ); } break; @@ -513,14 +517,14 @@ namespace Shadowsocks.Controller int len = _connetionRecvBuffer[1]; dst_addr = System.Text.Encoding.UTF8.GetString(_connetionRecvBuffer, 2, len); dst_port = (_connetionRecvBuffer[len + 2] << 8) + _connetionRecvBuffer[len + 3]; - if ( controller.GetCurrentConfiguration().isVerboseLogging ) { + if ( _config.isVerboseLogging ) { Logging.Info( $"connect to {dst_addr}:{dst_port}" ); } break; case 4: // IPv6 address, 16 bytes dst_addr = new IPAddress(_connetionRecvBuffer.Skip(1).Take(16).ToArray()).ToString(); dst_port = (_connetionRecvBuffer[17] << 8) + _connetionRecvBuffer[18]; - if ( controller.GetCurrentConfiguration().isVerboseLogging ) { + if ( _config.isVerboseLogging ) { Logging.Info( $"connect to [{dst_addr}]:{dst_port}" ); } break; diff --git a/shadowsocks-csharp/Controller/ShadowsocksController.cs b/shadowsocks-csharp/Controller/ShadowsocksController.cs index 6bf8de24..9cd2a77a 100755 --- a/shadowsocks-csharp/Controller/ShadowsocksController.cs +++ b/shadowsocks-csharp/Controller/ShadowsocksController.cs @@ -411,7 +411,7 @@ namespace Shadowsocks.Controller polipoRunner.Start(_config); - TCPRelay tcpRelay = new TCPRelay(this); + TCPRelay tcpRelay = new TCPRelay(this, _config); UDPRelay udpRelay = new UDPRelay(this); List services = new List(); services.Add(tcpRelay);