From 1e950b5c5665e1bd9f45ad61c25c82dbc7a22092 Mon Sep 17 00:00:00 2001 From: Student Main Date: Thu, 19 Mar 2020 15:08:35 +0800 Subject: [PATCH] workaround for can't send and recv at same time MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 看上去是同步问题,考虑重新设计Encryptor API --- .../Controller/Service/TCPRelay.cs | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/shadowsocks-csharp/Controller/Service/TCPRelay.cs b/shadowsocks-csharp/Controller/Service/TCPRelay.cs index 8327bda9..a10e397c 100644 --- a/shadowsocks-csharp/Controller/Service/TCPRelay.cs +++ b/shadowsocks-csharp/Controller/Service/TCPRelay.cs @@ -148,7 +148,9 @@ namespace Shadowsocks.Controller private TCPRelay _tcprelay; private Socket _connection; - private IEncryptor _encryptor; + private IEncryptor encryptor; + // workaround + private IEncryptor decryptor; private Server _server; private AsyncSession _currentRemoteSession; @@ -216,13 +218,14 @@ namespace Shadowsocks.Controller if (server == null || server.server == "") throw new ArgumentException("No server configured"); - _encryptor = EncryptorFactory.GetEncryptor(server.method, server.password); - + encryptor = EncryptorFactory.GetEncryptor(server.method, server.password); + decryptor = EncryptorFactory.GetEncryptor(server.method, server.password); this._server = server; /* prepare address buffer length for AEAD */ Logger.Debug($"_addrBufLength={_addrBufLength}"); - _encryptor.AddrBufLength = _addrBufLength; + encryptor.AddrBufLength = _addrBufLength; + decryptor.AddrBufLength = _addrBufLength; } public void Start(byte[] firstPacket, int length) @@ -277,7 +280,8 @@ namespace Shadowsocks.Controller { lock (_decryptionLock) { - _encryptor?.Dispose(); + encryptor?.Dispose(); + decryptor?.Dispose(); } } } @@ -825,7 +829,7 @@ namespace Shadowsocks.Controller { try { - _encryptor.Decrypt(_remoteRecvBuffer, bytesRead, _remoteSendBuffer, out bytesToSend); + decryptor.Decrypt(_remoteRecvBuffer, bytesRead, _remoteSendBuffer, out bytesToSend); } catch (CryptoErrorException) { @@ -898,7 +902,7 @@ namespace Shadowsocks.Controller { try { - _encryptor.Encrypt(_connetionRecvBuffer, length, _connetionSendBuffer, out bytesToSend); + encryptor.Encrypt(_connetionRecvBuffer, length, _connetionSendBuffer, out bytesToSend); } catch (CryptoErrorException) {