internal static void ReadCallback(IAsyncResult ar) { StateObject state = (StateObject)ar.AsyncState; Socket handler = state.workSocket; try { int bytesRead = handler.EndReceive(ar); DebugLog.Debug($"[{state.Id}] Reading {bytesRead} bytes from socket handler"); if (bytesRead > 0) { state.AddStringContent(Encoding.ASCII.GetString(state.buffer, 0, bytesRead)); if (handler.Available > 0) { DebugLog.Debug($"[{state.Id}] Socket handler contains {handler.Available} bytes remaining to read"); handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback), state); } else { var content = state.ReadAndFlushStringContent(); Task.Run(() => logContent(content.Trim(), state.Id.ToString())); DebugLog.Debug($"[{state.Id}] Socket handler connected: {handler.Connected}"); DebugLog.Debug($"[{state.Id}] Socket handler remaining bytes: {handler.Available}"); if (handler.Connected == false || handler.Available == 0) { DebugLog.Debug($"[{state.Id}] Shutting down socket connection"); handler.Shutdown(SocketShutdown.Both); handler.Close(); DebugLog.Info($"[{state.Id}] Socket connection closed"); } else { DebugLog.Debug($"[{state.Id}] Sending back around to get remaining stream content"); handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback), state); } } } } catch (Exception ex) { DebugLog.Warn(ex, $"[{state.Id}] ReadCallback exception"); } }