fix unlimiting server reading

This commit is contained in:
Sharikov P.P.
2026-01-16 01:54:00 +07:00
parent 87bccdddad
commit 4269d891e9
2 changed files with 39 additions and 45 deletions

View File

@@ -1,7 +1,6 @@
using System;
using System.CommandLine;
using System.CommandLine.Parsing;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
@@ -38,8 +37,6 @@ namespace f_cln
messageOption
};
rootCommand.Parse("--version").Invoke();
ParseResult parseResult = rootCommand.Parse(args);
if (parseResult.Errors.Count == 0)
{
@@ -90,21 +87,24 @@ namespace f_cln
Console.WriteLine("Подключено к серверу");
using var stream = client.GetStream();
using var reader = new StreamReader(stream, Encoding.UTF8);
using var writer = new StreamWriter(stream, Encoding.UTF8) { AutoFlush = true };
// Отправка сообщения
var messageBytes = Encoding.UTF8.GetBytes(message + Environment.NewLine);
await stream.WriteAsync(messageBytes, 0, messageBytes.Length);
await writer.WriteLineAsync(message);
Console.WriteLine($"Отправлено: {message}");
// Чтение ответа
var buffer = new byte[1024];
var bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length);
var response = await reader.ReadLineAsync();
if (bytesRead > 0)
if (response != null)
{
var response = Encoding.UTF8.GetString(buffer, 0, bytesRead).TrimEnd('\n', '\r');
Console.WriteLine($"Получено: {response}");
}
else
{
Console.WriteLine("Сервер не ответил");
}
}
catch (SocketException ex)
{
@@ -126,7 +126,8 @@ namespace f_cln
Console.WriteLine("Введите текст для отправки (или 'exit' для выхода):");
using var stream = client.GetStream();
var buffer = new byte[1024];
using var reader = new StreamReader(stream, Encoding.UTF8);
using var writer = new StreamWriter(stream, Encoding.UTF8) { AutoFlush = true };
while (true)
{
@@ -146,15 +147,13 @@ namespace f_cln
try
{
// Отправка сообщения
var messageBytes = Encoding.UTF8.GetBytes(input + Environment.NewLine);
await stream.WriteAsync(messageBytes, 0, messageBytes.Length);
await writer.WriteLineAsync(input);
// Чтение ответа
var bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length);
var response = await reader.ReadLineAsync();
if (bytesRead > 0)
if (response != null)
{
var response = Encoding.UTF8.GetString(buffer, 0, bytesRead).TrimEnd('\n', '\r');
Console.WriteLine($"Ответ: {response}");
}
else

View File

@@ -35,12 +35,6 @@ namespace f_srv
portOption
};
{
rootCommand.Parse("-h").Invoke();
rootCommand.Parse("--version").Invoke();
}
ParseResult parseResult = rootCommand.Parse(args);
if (parseResult.Errors.Count == 0)
{
@@ -58,7 +52,7 @@ namespace f_srv
// Ожидаем нажатие клавиши
Console.WriteLine("Сервер запущен. Нажмите любую клавишу для остановки...");
Console.ReadKey();
ConsoleKeyInfo ki = Console.ReadKey();
// Отправляем сигнал отмены
_cancellationTokenSource.Cancel();
@@ -69,7 +63,13 @@ namespace f_srv
// Ждем завершения сервера
await serverTask;
Console.WriteLine("Сервер остановлен.");
if (Console.KeyAvailable)
{
ConsoleKeyInfo key = Console.ReadKey();
}
Console.WriteLine(" \r\n ");
Console.WriteLine(" Сервер остановлен.");
return 0;
}
else
@@ -142,51 +142,46 @@ namespace f_srv
{
using (client)
using (var stream = client.GetStream())
using (var reader = new StreamReader(stream, Encoding.UTF8))
using (var writer = new StreamWriter(stream, Encoding.UTF8) { AutoFlush = true })
{
var buffer = new byte[1024];
var buffer = new StringBuilder();
var charBuffer = new char[1024];
while (!cancellationToken.IsCancellationRequested)
{
try
{
// Чтение данных от клиента с таймаутом
var readTask = stream.ReadAsync(buffer, 0, buffer.Length, cancellationToken);
var completedTask = await Task.WhenAny(readTask, Task.Delay(1000, cancellationToken));
// Чтение строки (до символа новой строки)
var line = await reader.ReadLineAsync(cancellationToken);
if (completedTask != readTask)
{
// Таймаут - проверяем отмену и продолжаем цикл
continue;
}
var bytesRead = await readTask;
if (bytesRead == 0)
if (line == null)
{
// Клиент отключился
Console.WriteLine($"Клиент отключился: {clientEndPoint}");
break;
}
// Преобразование байтов в строку
var receivedString = Encoding.UTF8.GetString(buffer, 0, bytesRead);
// Удаление символов новой строки для чистого вывода
var cleanString = receivedString.TrimEnd('\n', '\r');
Console.WriteLine($"Получено от {clientEndPoint}: {cleanString}");
Console.WriteLine($"Получено от {clientEndPoint}: {line}");
// Реверсирование строки
var reversedString = ReverseString(cleanString);
var reversedString = ReverseString(line);
Console.WriteLine($"Отправка: {reversedString}");
// Отправка реверсированной строки обратно клиенту
var responseBytes = Encoding.UTF8.GetBytes(reversedString + Environment.NewLine);
await stream.WriteAsync(responseBytes, 0, responseBytes.Length, cancellationToken);
await writer.WriteLineAsync(reversedString);
}
catch (OperationCanceledException)
{
// Игнорируем отмену при чтении/записи
break;
}
catch (IOException ex)
{
// Ошибка ввода/вывода - клиент отключился
Console.WriteLine($"Клиент отключился: {clientEndPoint} - {ex.Message}");
break;
}
}
}
}