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; } }
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(); }
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); }
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(); }
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()); } }
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(); }