private void OnDataReceiveFromClient(IAsyncResult result) { var state = (State)result.AsyncState; try { var bytesRead = state.ClientSocket.EndReceive(result); if (bytesRead > 0) { //here we check to see if front end has sent an SSLRequest message. //TODO: Currently, we assume the SSLRequest will come in a single buffer read. If the message were to come in two or more reads we would miss it. if (EndianHelpers.SwapEndianness(BitConverter.ToUInt32(state.ClientBuffer, 0)) == 8 && EndianHelpers.SwapEndianness(BitConverter.ToUInt32(state.ClientBuffer, 4)) == 80877103) { Console.WriteLine("Client has made SSLRequest. This is not supported."); _inProcessOfNegotiatingSSL = true; } //do nothing for now. Add logic here to parse FrontEnd requests. state.DatabaseSocket.Send(state.ClientBuffer, bytesRead, SocketFlags.None); state.ClientSocket.BeginReceive(state.ClientBuffer, 0, state.ClientBuffer.Length, 0, OnDataReceiveFromClient, state); } } catch { state.ClientSocket.Close(); state.DatabaseSocket.Close(); _resetStatemachine(); } }
private void handleRowDescription(byte[] buffer, int offset, int messageLength) { ushort numFields = EndianHelpers.SwapEndianness(BitConverter.ToUInt16(buffer, offset)); offset += 2; currentRowDescription = new RowDescriptionMessage(); currentRowDescription.NumFields = numFields; currentRowDescription.FieldDescriptions = new List <RowDescriptionField>(); for (int i = 0; i < numFields; i++) { RowDescriptionField df = new RowDescriptionField(); int z = offset; while (buffer[z] != 0) { z++; } string fieldName = Encoding.ASCII.GetString(buffer, offset, z - offset); offset = z + 1; //we add 1 because string will end with a null. df.FieldName = fieldName; uint objectId = EndianHelpers.SwapEndianness(BitConverter.ToUInt32(buffer, offset)); offset += 4; df.ObjectId = objectId; ushort attrId = EndianHelpers.SwapEndianness(BitConverter.ToUInt16(buffer, offset)); offset += 2; df.AttrId = attrId; uint dataTypeObjectId = EndianHelpers.SwapEndianness(BitConverter.ToUInt32(buffer, offset)); offset += 4; df.DataTypeObjectId = dataTypeObjectId; ushort dataTypeSize = EndianHelpers.SwapEndianness(BitConverter.ToUInt16(buffer, offset)); offset += 2; df.DataTypeSize = dataTypeSize; uint typeModifier = EndianHelpers.SwapEndianness(BitConverter.ToUInt32(buffer, offset)); offset += 4; df.TypeModifier = typeModifier; ushort formatCode = EndianHelpers.SwapEndianness(BitConverter.ToUInt16(buffer, offset)); offset += 2; df.FormatCode = formatCode; currentRowDescription.FieldDescriptions.Add(df); } var shouldModify = _shouldModifyTable(currentRowDescription.FieldDescriptions.First().ObjectId); currentRowDescription.ShouldModify = shouldModify; }
private byte[] handleDataRow(byte[] buffer, int messageLength) { var dataRow = new DataRowMessage(); int offset = 5; //1 byte for message type and 4 bytes for the int32 that states the length. ushort numFields = EndianHelpers.SwapEndianness(BitConverter.ToUInt16(buffer, 5)); dataRow.NumFields = numFields; if (numFields != 0) { dataRow.DataRowFields = new List <DataRowField>(numFields); } offset += 2; for (int i = 0; i < numFields; i++) { var dataRowField = new DataRowField(); int columnValueLength = IPAddress.NetworkToHostOrder(BitConverter.ToInt32(buffer, offset)); dataRowField.ColumnValueLength = columnValueLength; offset += 4; if (columnValueLength != -1) { dataRowField.ColumnValue = new byte[columnValueLength]; Buffer.BlockCopy(buffer, offset, dataRowField.ColumnValue, 0, columnValueLength); var colValue = Encoding.ASCII.GetString(buffer, offset, columnValueLength); offset += columnValueLength; } dataRow.DataRowFields.Add(dataRowField); } var modifiedResultStream = _modifyDataRow(dataRow, currentRowDescription); modifiedResultStream.Seek(0, SeekOrigin.Begin); var message = new byte[modifiedResultStream.Length + 5]; message[0] = buffer[0]; var newLength = EndianHelpers.ToBigE((int)modifiedResultStream.Length + 4); message[1] = newLength[0]; message[2] = newLength[1]; message[3] = newLength[2]; message[4] = newLength[3]; modifiedResultStream.Read(message, 5, (int)modifiedResultStream.Length); return(message); }
private int getMessageLength(byte[] buffer) { return((int)EndianHelpers.SwapEndianness(BitConverter.ToUInt32(buffer))); }