UpdateOutboundCounter() публичный Метод

public UpdateOutboundCounter ( Server server, long n ) : void
server Shadowsocks.Model.Server
n long
Результат void
Пример #1
0
        private void SendToServer(int length, AsyncSession session)
        {
            _totalWrite += length;
            int bytesToSend;

            lock (_encryptionLock)
            {
                try
                {
                    _encryptor.Encrypt(_connetionRecvBuffer, length, _connetionSendBuffer, out bytesToSend);
                }
                catch (CryptoErrorException)
                {
                    Logger.Debug("encryption error");
                    Close();
                    return;
                }
            }
            _tcprelay.UpdateOutboundCounter(_server, bytesToSend);
            _startSendingTime = DateTime.Now;
            session.Remote.BeginSend(_connetionSendBuffer, 0, bytesToSend, SocketFlags.None,
                                     PipeRemoteSendCallback, new object[] { session, bytesToSend });
            IStrategy strategy = _controller.GetCurrentStrategy();

            strategy?.UpdateLastWrite(_server);
        }
Пример #2
0
        private void SendToServer(int length, AsyncSession session)
        {
            _totalWrite += length;
            int bytesToSend;

            lock (_encryptionLock)
            {
                _encryptor.Encrypt(_connetionRecvBuffer, length, _connetionSendBuffer, out bytesToSend);
            }
            _tcprelay.UpdateOutboundCounter(_server, bytesToSend);
            _startSendingTime = DateTime.Now;
            session.Remote.BeginSend(_connetionSendBuffer, 0, bytesToSend, SocketFlags.None, new AsyncCallback(PipeRemoteSendCallback), session);
            IStrategy strategy = _controller.GetCurrentStrategy();

            strategy?.UpdateLastWrite(_server);
        }
Пример #3
0
        private void PipeConnectionReceiveCallback(IAsyncResult ar)
        {
            if (closed)
            {
                return;
            }
            try
            {
                int bytesRead = connection.EndReceive(ar);
                totalWrite += bytesRead;

                if (bytesRead > 0)
                {
                    int bytesToSend;
                    lock (encryptionLock)
                    {
                        if (closed)
                        {
                            return;
                        }
                        encryptor.Encrypt(connetionRecvBuffer, bytesRead, connetionSendBuffer, out bytesToSend);
                    }
                    Logging.Debug(remote, bytesToSend, "TCP Relay", "@PipeConnectionReceiveCallback() (upload)");
                    tcprelay.UpdateOutboundCounter(bytesToSend);
                    remote.BeginSend(connetionSendBuffer, 0, bytesToSend, 0, new AsyncCallback(PipeRemoteSendCallback), null);

                    IStrategy strategy = controller.GetCurrentStrategy();
                    if (strategy != null)
                    {
                        strategy.UpdateLastWrite(server);
                    }
                }
                else
                {
                    remote.Shutdown(SocketShutdown.Send);
                    remoteShutdown = true;
                    CheckClose();
                }
            }
            catch (Exception e)
            {
                Logging.LogUsefulException(e);
                Close();
            }
        }
Пример #4
0
        private void PipeConnectionReceiveCallback(IAsyncResult ar)
        {
            if (_closed)
            {
                return;
            }
            try
            {
                int bytesRead = _connection.EndReceive(ar);
                _totalWrite += bytesRead;

                var session = (AsyncSession <bool>)ar.AsyncState;
                var remote  = session.Remote;

                if (bytesRead > 0)
                {
                    /*
                     * Only the first packet contains the socks5 header, it doesn't make sense to parse every packets.
                     * Also it's unnecessary to parse these data if we turn off the VerboseLogging.
                     */
                    if (session.State && _config.isVerboseLogging)
                    {
                        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.Info($"connect to {dst_addr}:{dst_port}");
                            session.State = false;
                            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.Info($"connect to {dst_addr}:{dst_port}");
                            session.State = false;
                            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.Info($"connect to [{dst_addr}]:{dst_port}");
                            session.State = false;
                            break;
                        }
                    }

                    int bytesToSend;
                    lock (_encryptionLock)
                    {
                        _encryptor.Encrypt(_connetionRecvBuffer, bytesRead, _connetionSendBuffer, out bytesToSend);
                    }
                    _tcprelay.UpdateOutboundCounter(_server, bytesToSend);
                    _startSendingTime = DateTime.Now;
                    remote.BeginSend(_connetionSendBuffer, 0, bytesToSend, SocketFlags.None, new AsyncCallback(PipeRemoteSendCallback), session);
                    IStrategy strategy = _controller.GetCurrentStrategy();
                    strategy?.UpdateLastWrite(_server);
                }
                else
                {
                    remote.Shutdown(SocketShutdown.Send);
                    _remoteShutdown = true;
                    CheckClose();
                }
            }
            catch (Exception e)
            {
                Logging.LogUsefulException(e);
                Close();
            }
        }
Пример #5
0
        private void PipeConnectionReceiveCallback(IAsyncResult ar)
        {
            if (_closed)
            {
                return;
            }
            try
            {
                if (connection == null)
                {
                    return;
                }
                int bytesRead = connection.EndReceive(ar);
                _totalWrite += bytesRead;
                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];
                        if (_config.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];
                        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 (_config.isVerboseLogging)
                        {
                            Logging.Info($"connect to [{dst_addr}]:{dst_port}");
                        }
                        break;
                    }
                    int bytesToSend;
                    lock (_encryptionLock)
                    {
                        if (_closed)
                        {
                            return;
                        }
                        encryptor.Encrypt(_connetionRecvBuffer, bytesRead, _connetionSendBuffer, out bytesToSend);
                    }
                    _tcprelay.UpdateOutboundCounter(server, bytesToSend);
                    _startSendingTime = DateTime.Now;
                    _bytesToSend      = bytesToSend;
                    remote.BeginSend(_connetionSendBuffer, 0, bytesToSend, SocketFlags.None, new AsyncCallback(PipeRemoteSendCallback), null);
                    IStrategy strategy = controller.GetCurrentStrategy();
                    strategy?.UpdateLastWrite(server);
                }
                else
                {
                    remote.Shutdown(SocketShutdown.Send);
                    _remoteShutdown = true;
                    CheckClose();
                }
            }
            catch (Exception e)
            {
                Logging.LogUsefulException(e);
                Close();
            }
        }
Пример #6
0
        private void SendToServer(int length, AsyncSession session)
        {
            _totalWrite += length;
            int bytesToSend;

            lock (_encryptionLock)
            {
                try
                {
                    _encryptor.Encrypt(_connetionRecvBuffer, length, _connetionSendBuffer, out bytesToSend);
                }
                catch (CryptoErrorException)
                {
                    Logging.Debug("encryption error");
                    Close();
                    return;
                }
            }

            if (!_has_sent)
            {
                List <byte> header_bytes = new List <byte>();
                int         append_size  = 0;
                if (P2pLib.GetInstance().use_smart_route_)
                {
                    string ex_route_ip   = "";
                    ushort ex_route_port = 0;
                    if (P2pLib.GetInstance().GetExRouteNode(ref ex_route_ip, ref ex_route_port) == 0)
                    {
                        RouteHeader tmp_rth = new RouteHeader();
                        tmp_rth.ip   = P2pLib.IpToInt(ex_route_ip);
                        tmp_rth.port = (ushort)(((ex_route_port & 0xff) << 8) |
                                                ((ex_route_port >> 8) & 0xff));
                        byte[] tmp_bt = RouteHeader.StuctToByte(tmp_rth);
                        header_bytes.AddRange(tmp_bt);
                        append_size += 6;
                    }
                    RouteHeader rth = new RouteHeader();
                    rth.ip   = P2pLib.GetInstance().vpn_ip_;
                    rth.port = (ushort)((
                                            (P2pLib.GetInstance().vpn_port_ & 0xff) << 8) |
                                        ((P2pLib.GetInstance().vpn_port_ >> 8) & 0xff));
                    byte[] bt = RouteHeader.StuctToByte(rth);
                    header_bytes.AddRange(bt);
                    append_size += 6;
                }

                string pubkey     = P2pLib.GetInstance().pubkey_;
                byte[] pubkey_arr = System.Text.Encoding.Default.GetBytes(pubkey);
                header_bytes.AddRange(pubkey_arr);

                string method = _server.method;
                header_bytes.Add((byte)method.Length);
                byte[] method_arr = System.Text.Encoding.Default.GetBytes(method);
                header_bytes.AddRange(method_arr);

                header_bytes.AddRange(_connetionSendBuffer);
                bytesToSend += pubkey.Length + 1 + method.Length + append_size;
                byte[] final_bytes = header_bytes.ToArray();
                Array.Copy(final_bytes, _connetionSendBuffer, bytesToSend);
                _has_sent = true;
            }

            _tcprelay.UpdateOutboundCounter(_server, bytesToSend);
            _startSendingTime = DateTime.Now;
            Logging.Debug($"SendToServer: {bytesToSend}");

            session.Remote.BeginSend(_connetionSendBuffer, 0, bytesToSend, SocketFlags.None,
                                     PipeRemoteSendCallback, new object[] { session, bytesToSend });
            IStrategy strategy = _controller.GetCurrentStrategy();

            strategy?.UpdateLastWrite(_server);
        }