コード例 #1
0
        protected override void OnStart(string[] args)
        {
            try
            {
                string textProtocolIP   = MemConfiguration.TextProtocolIP;
                int    textPort         = MemConfiguration.TextProtocolPort;
                string binaryProtocolIP = MemConfiguration.BinaryProtocolIP;
                int    binaryPort       = MemConfiguration.BinaryProtocolPort;

                if (textPort == binaryPort)
                {
                    throw new ArgumentException("Ports cannot be same for text and binary protocol.");
                }

                _tcpTextGateWay = new TcpNetworkGateway(textProtocolIP, textPort, Alachisoft.NCache.Integrations.Memcached.ProxyServer.NetworkGateway.ProtocolType.Text);
                _tcpTextGateWay.StartListenForClients();
                LogManager.Logger.Info("Proxy server for text protocol started at IP: " + textProtocolIP + " port: " + textPort);


                _tcpBinaryGateWay = new TcpNetworkGateway(binaryProtocolIP, binaryPort, Alachisoft.NCache.Integrations.Memcached.ProxyServer.NetworkGateway.ProtocolType.Binary);
                _tcpBinaryGateWay.StartListenForClients();
                LogManager.Logger.Info("Proxy server for binary protocol started at IP: " + binaryProtocolIP + " port: " + binaryPort);
            }
            catch (Exception e)
            {
                LogManager.Logger.Fatal("Service", "\t Failed to start proxy server. Exception : " + e);
                throw;
            }
        }
コード例 #2
0
        public override void StartParser()
        {
            try
            {
                int  noOfBytes = 0;
                bool go        = true;

                do
                {
                    lock (this)
                    {
                        if (_inputDataStream.Lenght == 0 && this.State != ParserState.ReadyToDispatch)
                        {
                            this.Alive = false;
                            return;
                        }
                    }

                    switch (this.State)
                    {
                    case ParserState.Ready:
                        noOfBytes       = _inputDataStream.Read(_rawData, _rawDataOffset, 24 - _rawDataOffset);
                        _rawDataOffset += noOfBytes;
                        if (_rawDataOffset == 24)
                        {
                            _rawDataOffset = 0;
                            this.Parse();
                        }
                        break;

                    case ParserState.WaitingForData:
                        noOfBytes       = _inputDataStream.Read(_rawData, _rawDataOffset, this.CommandDataSize - _rawDataOffset);
                        _rawDataOffset += noOfBytes;
                        if (_rawDataOffset == this.CommandDataSize)
                        {
                            _rawDataOffset = 0;
                            this.Build();
                        }
                        break;

                    case ParserState.ReadyToDispatch:

                        _logManager.Debug("BinaryProtocolParser", _command.Opcode + " command recieved.");
                        ConsumerStatus executionMgrStatus = _commandConsumer.RegisterCommand(_command);    //this.RegisterForExecution(_command);
                        this.State = ParserState.Ready;
                        go         = executionMgrStatus == ConsumerStatus.Running;
                        break;
                    }
                } while (go);
            }
            catch (Exception e)
            {
                _logManager.Fatal("BinaryProtocolParser", "Exception occured while parsing text command. " + e.Message);
                TcpNetworkGateway.DisposeClient(_memTcpClient);
                return;
            }
            this.Dispatch();
        }
コード例 #3
0
        private void StartSendingResponse()
        {
            bool go = false;

            do
            {
                if (_disposed)
                {
                    return;
                }
                AbstractCommand command     = _responseQueue.Dequeue();
                byte[]          outpuBuffer = BuildBinaryResponse(command);
                try
                {
                    if (this._disposed)
                    {
                        return;
                    }
                    if (outpuBuffer != null)
                    {
                        _stream.Write(outpuBuffer, 0, outpuBuffer.Length);
                    }
                    if (command.Opcode == Opcode.Quit || command.Opcode == Opcode.QuitQ)
                    {
                        TcpNetworkGateway.DisposeClient(_memTcpClient);
                        return;
                    }
                }
                catch (Exception e)
                {
                    _logManager.Error("BinaryResponseManager.StartSendingResponse()", "\tFailed to send response. " + e.Message);
                    return;
                }

                lock (this)
                {
                    _alive = go = _responseQueue.Count > 0;
                }
            } while (go);
        }
コード例 #4
0
        static void Main(string[] args)
        {
            try
            {
                string textProtocolIP   = MemConfiguration.TextProtocolIP;
                int    textPort         = MemConfiguration.TextProtocolPort;
                string binaryProtocolIP = MemConfiguration.BinaryProtocolIP;
                int    binaryPort       = MemConfiguration.BinaryProtocolPort;

                if (textPort == binaryPort)
                {
                    throw new ArgumentException("Ports cannot be same for text and binary protocol.");
                }

                TcpNetworkGateway tcpTextGateWay = new TcpNetworkGateway(textProtocolIP, textPort, Alachisoft.NCache.Integrations.Memcached.ProxyServer.NetworkGateway.ProtocolType.Text);
                tcpTextGateWay.StartListenForClients();
                LogManager.Logger.Info("Proxy server for text protocol started at IP: " + textProtocolIP + " port: " + textPort);

                TcpNetworkGateway tcpBinaryGateWay = new TcpNetworkGateway(binaryProtocolIP, binaryPort, Alachisoft.NCache.Integrations.Memcached.ProxyServer.NetworkGateway.ProtocolType.Binary);
                tcpBinaryGateWay.StartListenForClients();
                LogManager.Logger.Info("Proxy server for binary protocol started at IP: " + binaryProtocolIP + " port: " + binaryPort);
            }
            catch (Exception e)
            {
                LogManager.Logger.Fatal("Service", "\t Failed to start proxy server. " + e.Message);
            }

            Console.WriteLine("Press Esc to exit.");
            ConsoleKey inputKey;

            do
            {
                inputKey = Console.ReadKey(false).Key;
            } while (inputKey != ConsoleKey.Escape);
            CacheFactory.DisposeCacheProvider();
        }
コード例 #5
0
        private byte[] BuildTextResponse(AbstractCommand command)
        {
            _logManager.Debug("TextResponseManager.BuildTextResponse", "Building response for command : " + command.Opcode);

            if (command.NoReply)
            {
                return new byte[] {}
            }
            ;

            if (command.ExceptionOccured)
            {
                return(MemcachedEncoding.BinaryConverter.GetBytes("SERVER_ERROR " + command.ErrorMessage + "\r\n"));
            }
            if (command.ErrorMessage != null)
            {
                return(MemcachedEncoding.BinaryConverter.GetBytes(command.ErrorMessage + "\r\n"));
            }

            DataStream resultStream = new DataStream();

            switch (command.Opcode)
            {
            case Opcode.Set:
            case Opcode.Add:
            case Opcode.Replace:
            case Opcode.Append:
            case Opcode.Prepend:
                if (command.OperationResult.ReturnResult == Result.SUCCESS)
                {
                    resultStream.Write(MemcachedEncoding.BinaryConverter.GetBytes("STORED\r\n"));
                }
                else
                {
                    resultStream.Write(MemcachedEncoding.BinaryConverter.GetBytes("NOT_STORED\r\n"));
                }
                break;

            case Opcode.CAS:
                switch (command.OperationResult.ReturnResult)
                {
                case Result.SUCCESS:
                    resultStream.Write(MemcachedEncoding.BinaryConverter.GetBytes("STORED\r\n"));
                    break;

                case Result.ITEM_MODIFIED:
                    resultStream.Write(MemcachedEncoding.BinaryConverter.GetBytes("EXISTS\r\n"));
                    break;

                case Result.ITEM_NOT_FOUND:
                    resultStream.Write(MemcachedEncoding.BinaryConverter.GetBytes("NOT_FOUND\r\n"));
                    break;

                default:
                    break;
                }
                break;

            case Opcode.Get:
            case Opcode.Gets:
                List <GetOpResult> results = (command as GetCommand).Results;
                foreach (GetOpResult result in results)
                {
                    if (result == null)
                    {
                        continue;
                    }
                    byte[] value       = result.Value as byte[];
                    string valueString = null;
                    if (command.Opcode == Opcode.Get)
                    {
                        valueString = string.Format("VALUE {0} {1} {2}\r\n", result.Key, result.Flag, value.Length);
                    }
                    else
                    {
                        valueString = string.Format("VALUE {0} {1} {2} {3}\r\n", result.Key, result.Flag, value.Length, result.Version);
                    }
                    resultStream.Write(MemcachedEncoding.BinaryConverter.GetBytes(valueString));
                    resultStream.Write(value);
                    resultStream.Write(MemcachedEncoding.BinaryConverter.GetBytes("\r\n"));
                }
                resultStream.Write(MemcachedEncoding.BinaryConverter.GetBytes("END\r\n"));
                break;

            case Opcode.Increment:
            case Opcode.Decrement:
                switch (command.OperationResult.ReturnResult)
                {
                case Result.SUCCESS:
                    long value = (long)(command.OperationResult as MutateOpResult).MutateResult;
                    resultStream.Write(MemcachedEncoding.BinaryConverter.GetBytes(value.ToString() + "\r\n"));
                    break;

                case Result.ITEM_TYPE_MISMATCHED:
                    resultStream.Write(MemcachedEncoding.BinaryConverter.GetBytes("CLIENT_ERROR cannot increment or decrement non-numeric value\r\n"));
                    break;

                case Result.ITEM_NOT_FOUND:
                    resultStream.Write(MemcachedEncoding.BinaryConverter.GetBytes("NOT_FOUND\r\n"));
                    break;

                default:
                    resultStream.Write(MemcachedEncoding.BinaryConverter.GetBytes("ERROR\r\n"));
                    break;
                }
                break;

            case Opcode.Delete:
                if (command.OperationResult.ReturnResult == Result.SUCCESS)
                {
                    resultStream.Write(MemcachedEncoding.BinaryConverter.GetBytes("DELETED\r\n"));
                }
                else
                {
                    resultStream.Write(MemcachedEncoding.BinaryConverter.GetBytes("NOT_FOUND\r\n"));
                }
                break;

            case Opcode.Touch:
                if (command.OperationResult.ReturnResult == Result.SUCCESS)
                {
                    resultStream.Write(MemcachedEncoding.BinaryConverter.GetBytes("TOUCHED\r\n"));
                }
                else
                {
                    resultStream.Write(MemcachedEncoding.BinaryConverter.GetBytes("NOT_FOUND\r\n"));
                }
                break;

            case Opcode.Flush:
                resultStream.Write(MemcachedEncoding.BinaryConverter.GetBytes("OK\r\n"));
                break;

            case Opcode.Version:
                string version = command.OperationResult.Value as string;
                resultStream.Write(MemcachedEncoding.BinaryConverter.GetBytes(version + "\r\n"));
                break;

            case Opcode.Verbosity:
            case Opcode.Slabs_Reassign:
            case Opcode.Slabs_Automove:
                if (command.OperationResult.ReturnResult == Result.SUCCESS)
                {
                    resultStream.Write(MemcachedEncoding.BinaryConverter.GetBytes("OK\r\n"));
                }
                else
                {
                    resultStream.Write(MemcachedEncoding.BinaryConverter.GetBytes("ERROR\r\n"));
                }
                break;

            case Opcode.Stat:
                Hashtable stats = command.OperationResult.Value as Hashtable;
                if (stats == null)
                {
                    resultStream.Write(MemcachedEncoding.BinaryConverter.GetBytes("END\r\n"));
                    break;
                }
                IDictionaryEnumerator ie = stats.GetEnumerator();
                string statString        = null;
                while (ie.MoveNext())
                {
                    statString = string.Format("STAT {0} {1}\r\n", ie.Key, ie.Value);
                    resultStream.Write(MemcachedEncoding.BinaryConverter.GetBytes(statString));
                }
                resultStream.Write(MemcachedEncoding.BinaryConverter.GetBytes("END\r\n"));
                break;

            case Opcode.Quit:
                TcpNetworkGateway.DisposeClient(_memTcpClient);
                break;
            }

            return(resultStream.ReadAll());
        }
    }
コード例 #6
0
        public override void StartParser()
        {
            try
            {
                string command   = null;
                int    noOfBytes = 0;
                bool   go        = true;

                do
                {
                    lock (this)
                    {
                        if (_inputDataStream.Lenght == 0 && this.State != ParserState.ReadyToDispatch)
                        {
                            this.Alive = false;
                            return;
                        }
                    }

                    switch (this.State)
                    {
                    case ParserState.Ready:
                        noOfBytes       = _inputDataStream.Read(_rawData, _rawDataOffset, 1);
                        _rawDataOffset += noOfBytes;

                        if (_rawDataOffset > 1 && (char)_rawData[_rawDataOffset - 2] == '\r' && (char)_rawData[_rawDataOffset - 1] == '\n')
                        {
                            command = MemcachedEncoding.BinaryConverter.GetString(_rawData, 0, (_rawDataOffset - 2));
                            this.Parse(command);
                            _rawDataOffset = 0;
                        }
                        if (_rawDataOffset == _rawData.Length)
                        {
                            byte[] newBuffer = new byte[_rawData.Length * 2];
                            Buffer.BlockCopy(_rawData, 0, newBuffer, 0, _rawData.Length);
                            _rawData = newBuffer;
                        }
                        if (_rawDataOffset > MemConfiguration.MaximumCommandLength)
                        {
                            TcpNetworkGateway.DisposeClient(_memTcpClient);
                            return;
                        }
                        break;

                    case ParserState.WaitingForData:
                        noOfBytes       = _inputDataStream.Read(_rawData, _rawDataOffset, this.CommandDataSize + 2 - _rawDataOffset);
                        _rawDataOffset += noOfBytes;

                        if (_rawDataOffset == this.CommandDataSize + 2)
                        {
                            _rawDataOffset = 0;
                            this.Build(_rawData);
                        }
                        break;

                    case ParserState.ReadyToDispatch:
                        _logManager.Debug("TextProtocolParser", _command.Opcode + " command recieved.");
                        ConsumerStatus executionMgrStatus = _commandConsumer.RegisterCommand(_command);
                        this.State = ParserState.Ready;
                        go         = executionMgrStatus == ConsumerStatus.Running;
                        break;
                    }
                } while (go);
            }
            catch (Exception e)
            {
                _logManager.Fatal("TextProtocolParser", "Exception occured while parsing text command. " + e.Message);
                TcpNetworkGateway.DisposeClient(_memTcpClient);
                return;
            }
            this.Dispatch();
        }