コード例 #1
0
ファイル: RawHandler.cs プロジェクト: whgfu/socks5serverv2
 public void OnClientDisconnected(AsyncTCPLib.OnClientDisconnectedEventArgs <AsyncTCPLib.VirtualClient> e)
 {
     Association.Carrier userCarrier = this._associations[e.Client.Id];
     if (userCarrier != null)
     {
         long accountId = Program.GetInstance().Server.Clients[e.Client.Id].Data.AuthenticationInfo.Id;
         if (userCarrier.Command == Socks.Constants.Command.Connect)
         {
             Association.ConnectProxy proxy = (Association.ConnectProxy)userCarrier.Data;
             Commit.Info info = new Commit.Info(accountId);
             if (userCarrier.WiredTx > 0 ||
                 userCarrier.WiredRx > 0)
             {
                 info.Stats = new Commit.Stats(userCarrier.WiredTx, userCarrier.WiredRx);
             }
             info.Command = new Commit.Command(
                 userCarrier.Command,
                 e.Client.RemoteEndPoint,
                 proxy.Client.RemoteEndPoint,
                 userCarrier.WiredTx,
                 userCarrier.WiredRx,
                 userCarrier.CommandTime,
                 userCarrier.CommandSuccess
                 );
             this._plugin.CommitInfo(info);
         }
         this._associations[e.Client.Id] = null;
     }
 }
コード例 #2
0
        public void CommitInfo(Commit.Info info)
        {
            this._commitReset.WaitOne();
            this._commitReset.Reset();

            this._commitInfo.Add(info);

            this._commitReset.Set();
        }
コード例 #3
0
        private async void _processCommits()
        {
            while (true)
            {
                this._commitReset.WaitOne();
                this._commitReset.Reset();

                if (this._commitInfo.Count > 0)
                {
                    Program programInstance = Program.GetInstance();

                    Plugin.IDatabaseConnection connection = await programInstance.Database.GetConnection();

                    using (Plugin.IDatabaseTransaction transaction = connection.OpenTransaction())
                    {
                        programInstance.Log.DebugFormat("Processing commit info, {0} commits", this._commitInfo.Count);
                        int totalQueries = 0;

                        for (int i = this._commitInfo.Count - 1; i >= 0; i--)
                        {
                            Commit.Info info = this._commitInfo[i];

                            if (info.Stats.HasValue)
                            {
                                await programInstance.Database.CommitStats(connection, info.AccountId, info.Stats.Value.WiredTx, info.Stats.Value.WiredRx);

                                totalQueries++;
                            }
                            if (info.Command.HasValue)
                            {
                                await programInstance.Database.CommitCommand(connection, info.AccountId, info.Command.Value.SocksCommand, info.Command.Value.ClientEndPoint, info.Command.Value.ProxyEndPoint, info.Command.Value.WiredTx, info.Command.Value.WiredRx, info.Command.Value.CommandTime, info.Command.Value.Success);

                                totalQueries++;
                            }

                            programInstance.Log.DebugFormat("Pci > stats: {0}, command: {1} for {2}", info.Stats.HasValue, info.Command.HasValue, info.AccountId);

                            this._commitInfo.RemoveAt(i);
                        }

                        programInstance.Log.DebugFormat("Processing commit info, commiting {0} queries to database impl", totalQueries);
                        transaction.Commit();
                    }

                    connection.IsBusy = false;
                }

                this._commitReset.Set();
                Thread.Sleep(2500); // process all 2.5 seconds
            }
        }