/// <summary> /// Reads the response from the socket /// </summary> /// <param name="socket"></param> /// <returns></returns> public unsafe bool Read(PooledSocket socket) { this.StatusCode = -1; if (!socket.IsAlive) { return(false); } try { var header = new byte[BinaryResponse.HeaderLength]; socket.Receive(header, 0, header.Length); this.DeserializeHeader(header, out var dataLength, out var extraLength); if (dataLength > 0) { var data = new byte[dataLength]; socket.Receive(data, 0, dataLength); this.Extra = new ArraySegment <byte>(data, 0, extraLength); this.Data = new ArraySegment <byte>(data, extraLength, data.Length - extraLength); } return(this.StatusCode == 0); } catch (Exception ex) { this._logger.LogError(ex, "Read: Error occurred while reading socket"); throw; } }
public static GetResponse ReadItem(PooledSocket socket) { var description = TextSocketHelper.ReadResponse(socket); if (String.Compare(description, "END", StringComparison.Ordinal) == 0) { return(null); } else if (description.Length < 6 || String.Compare(description, 0, "VALUE ", 0, 6, StringComparison.Ordinal) != 0) { throw new MemcachedClientException("No VALUE response received.\r\n" + description); } // response is: // VALUE <key> <flags> <bytes> [<cas unique>] // 0 1 2 3 4 // // cas only exists in 1.2.4+ // ulong cas = 0; var parts = description.Split(' '); if (parts.Length == 5) { if (!UInt64.TryParse(parts[4], out cas)) { throw new MemcachedClientException("Invalid CAS VALUE received."); } } else if (parts.Length < 4) { throw new MemcachedClientException("Invalid VALUE response received: " + description); } var flags = UInt16.Parse(parts[2], CultureInfo.InvariantCulture); var length = Int32.Parse(parts[3], CultureInfo.InvariantCulture); var allData = new byte[length]; var eod = new byte[2]; socket.Receive(allData, 0, length); socket.Receive(eod, 0, 2); // data is terminated by \r\n var result = new GetResponse(parts[1], flags, cas, allData); GetHelper.Logger = GetHelper.Logger ?? Caching.Logger.CreateLogger(typeof(GetHelper)); if (GetHelper.Logger.IsEnabled(LogLevel.Debug)) { GetHelper.Logger.LogDebug("Received value. Data type: {0}, size: {1}.", result.Item.Flags, result.Item.Data.Count); } return(result); }
/// <summary> /// Reads a line from the socket. A line is terninated by \r\n. /// </summary> /// <returns></returns> static string ReadLine(PooledSocket socket) { using (var stream = new MemoryStream(50)) { var gotR = false; byte data; while (true) { data = socket.Receive(); if (data == 13) { gotR = true; continue; } if (gotR) { if (data == 10) { break; } stream.WriteByte(13); gotR = false; } stream.WriteByte(data); } var result = Encoding.ASCII.GetString(stream.ToArray(), 0, (int)stream.Length); Logger = Logger ?? Caching.Logger.CreateLogger(typeof(TextSocketHelper)); if (Logger.IsEnabled(LogLevel.Debug)) { Logger.LogDebug("ReadLine: " + result); } return(result); } }