예제 #1
0
        /// <summary>
        /// Stops TCP/IP listener and disposes the resources.
        /// </summary>
        public static void Stop()
        {
            try
            {
                if (Logger.IsDebugEnabled)
                {
                    Logger.Debug("NJ4XServer stopped: tcp=" + Instance._tcpListener.LocalEndpoint);
                }
                Instance._isDead = true;
                if (WarnTimer != null)
                {
                    WarnTimer.Dispose();
                    WarnTimer = null;
                }
                Instance._tcpListener.Stop();
                Instance._datagramSocket.Close();
            }
// ReSharper disable EmptyGeneralCatchClause
            catch (Exception)
// ReSharper restore EmptyGeneralCatchClause
            {
            }
            finally
            {
                Instance = null;
            }
        }
예제 #2
0
        public void Run(object x)
        {
            var sb         = new StringBuilder();
            var resStarted = false;
            var firstChar  = (char)0;

            while (true)
            {
                try
                {
                    var b = _socketStream.ReadByte();
                    if (b < 0)
                    {
                        if (Logger.IsInfoEnabled)
                        {
                            Logger.Info("Client " + _clientName + " disconnected");
                        }
                        return;
                    }
                    if (firstChar == (char)0)
                    {
                        firstChar = (char)b;
                    }
                    //if (b == '\n' || b == '\r')
                    if (b == MT4.ArgEndC || firstChar != MT4.ArgStartC)
                    {
                        resStarted = false;
                        var line = sb.ToString();
                        sb.Length = 0;
                        if (Logger.IsDebugEnabled)
                        {
                            Logger.Debug("GOT FROM " + _clientName + ": " + line);
                        }
                        //
                        if (line.StartsWith("HELLO"))
                        {
                            _clientName     = line.Substring(5);
                            _strategyRunner = new MT4TerminalConnection(_clientName);
                            _strategyRunner.SetSocket(_socket, _socketStream);
                            _strategyRunner.SetNoMultiLineConnection(firstChar != MT4.ArgStartC);
                            if (_id != 0 && !_strategyRunner.IsNoUDPAllowed)
                            {
                                SendToClient("HELLO " + _id + " 0"); // 0 - proto
                                try
                                {
                                    _strategyRunner.ID = _id;
                                }
                                catch (Exception e)
                                {
                                    Logger.Error("", e);
                                    _socket.Close();
                                    return;
                                }
                            }
                            else
                            {
                                SendToClient("HELLO");
                            }
                            //
                        }
                        else if (line.StartsWith("BOX"))
                        {
                            _boxId = line.Substring(3);
                            //
                            var activationKey = _boxId.Equals("5")
                                ? NJ4XServer.AppSetting("nj4x_mt5_activation_key", null)
                                : NJ4XServer.AppSetting("nj4x_activation_key",
                                                        NJ4XServer.AppSetting("nj4x_mt4_activation_key", null));
                            if (activationKey != null)
                            {
                                SendToClient(activationKey + " ");
                            }
                            else
                            {
                                SendToClient("943289279" + " ");
                            }
                            //
                        }
                        else if (line.StartsWith("XOB"))
                        {
                            var res = line.Substring(3);
                            //
                            var isLimited = !res.StartsWith("OK");
                            //
                            lock (typeof(NJ4XServer))
                            {
                                if (isLimited && NJ4XServer.WarnTimer == null)
                                {
                                    Logger.Info("Setting WarnTimer: " + line);
                                    NJ4XServer.WarnTimer = new Timer(
                                        delegate
                                    {
                                        if (!_warnMsgShown)
                                        {
                                            _warnMsgShown = true;
                                            if (Environment.UserInteractive)
                                            {
                                                MessageBox.Show(WarnMsg());
                                            }
                                        }
                                        //
                                        if (Logger.IsWarnEnabled)
                                        {
                                            Logger.Warn("");
                                            Logger.Warn(
                                                "*************************************************************************");
                                            Logger.Warn(WarnMsg());
                                            Logger.Warn(
                                                "*************************************************************************");
                                            Logger.Warn("");
                                        }
                                        else
                                        {
                                            Console.WriteLine("");
                                            Console.WriteLine(
                                                "*************************************************************************");
                                            Console.WriteLine(WarnMsg());
                                            Console.WriteLine(
                                                "*************************************************************************");
                                            Console.WriteLine("");
                                        }
                                    },
                                        null, 5000, 60000
                                        );
                                }
                            }
                            //
                            try
                            {
                                var udpPort = 0;
                                if (!isLimited && res.Length > 2)
                                {
                                    udpPort = int.Parse(res.Substring(2));
                                }
                                else if (res.StartsWith("NOK") && res.Length > 3)
                                {
                                    _boxId = res.Substring(3);
                                    //udpPort = Int32.Parse(res.Substring(3));
                                }
                                if (udpPort > 0)
                                {
                                    _strategyRunner.SetUDPPort(udpPort);
                                }
                                //
                                if (_strategyRunner.Start(_clientName, isLimited, this))
                                {
                                    if (Logger.IsInfoEnabled)
                                    {
                                        Logger.Info("Client " + _clientName + " connected, ClientId=" + _strategyRunner.ClientId);
                                    }
                                }
                                else
                                {
                                    lock (PendingConnections)
                                    {
                                        PendingConnections[_clientName] = this;
                                    }
                                    var   thisGreeter = this;
                                    Timer t           = null;
                                    t = new Timer(state =>
                                    {
                                        Greeter greeter; // = PendingConnections[_clientName];
                                        lock (PendingConnections)
                                        {
                                            PendingConnections.TryGetValue(_clientName, out greeter);
                                        }
                                        if (ReferenceEquals(thisGreeter, greeter))
                                        {
                                            try
                                            {
                                                SendToClient("WAIT");
                                                if (_strategyRunner.Start(_clientName, isLimited, this))
                                                {
                                                    if (Logger.IsInfoEnabled)
                                                    {
                                                        Logger.Info("Client " + _clientName + " connected, ClientId=" + _strategyRunner.ClientId);
                                                    }
                                                }
                                                else
                                                {
                                                    return; // wait more
                                                }
                                            }
                                            catch (Exception e)
                                            {
                                                if (Logger.IsInfoEnabled)
                                                {
                                                    Logger.Info("Client " + _clientName + " disconnected (" + e +
                                                                ")");
                                                }
                                            }
                                            //
                                            lock (PendingConnections)
                                            {
                                                PendingConnections.Remove(_clientName);
                                            }
                                        }
                                        else
                                        {
                                            // ReSharper disable once PossibleNullReferenceException
                                            // ReSharper disable once AccessToModifiedClosure
                                            if (t != null)
                                            {
                                                // ReSharper disable once AccessToModifiedClosure
                                                t.Dispose();
                                            }
                                        }
                                    },
//                                        delegate
//                                        {
//                                            lock (PendingConnections)
//                                            {
//                                                if (PendingConnections.TryGetValue(_clientName, out greeter))
//                                                {
//                                                    if (ReferenceEquals(thisGreeter, greeter))
//                                                    {
//                                                        try
//                                                        {
//                                                            SendToClient("WAIT");
//                                                            if (_strategyRunner.Start(_clientName, isLimited, this))
//                                                            {
//                                                                if (Logger.IsInfoEnabled)
//                                                                {
//                                                                    Logger.Info("Client " + _clientName + " connected.");
//                                                                }
//                                                            }
//                                                            else
//                                                            {
//                                                                return; // wait more
//                                                            }
//                                                        }
//                                                        catch (Exception e)
//                                                        {
//                                                            if (Logger.IsInfoEnabled)
//                                                            {
//                                                                Logger.Info("Client " + _clientName + " disconnected (" + e + ")");
//                                                            }
//                                                        }
//                                                        //
//                                                        PendingConnections.Remove(_clientName);
//                                                    }
//                                                }
//                                                // ReSharper disable once PossibleNullReferenceException
//                                                // ReSharper disable once AccessToModifiedClosure
//                                                t[0].Dispose();
//                                            }
//                                        },
                                                  null, 10, 2000
                                                  );
                                }
                                //
                                return;
                            }
                            catch (Exception e)
                            {
                                Logger.Error("", e);
                                _socket.Close();
                            }
                        }
                        else
                        {
                            Logger.Error("Unrecognized client (" + _clientName + ") request: [" + line + "]");
                        }
                    }
                    else
                    {
                        if (resStarted || firstChar != MT4.ArgStartC)
                        {
                            sb.Append((char)b);
                        }
                        else
                        {
                            resStarted = (b == MT4.ArgStartC);
                        }
                    }
                }
                catch (Exception e)
                {
                    if (Logger.IsInfoEnabled)
                    {
                        Logger.Info("Client " + _clientName + " disconnected (" + e + ")");
                    }
                    break;
                }
            }
        }