Files
LINUX/f-cln/Program.cs
2026-01-16 00:30:19 +07:00

179 lines
6.5 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System;
using System.CommandLine;
using System.CommandLine.Parsing;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
namespace f_cln
{
class Program
{
static async Task<int> Main(string[] args)
{
// Создание команды с аргументами
Option<string> ipOption = new("address", new[] { "--ip", "-i" })
{
Description = "IP адрес сервера (по умолчанию: localhost)",
DefaultValueFactory = parseResult => "localhost"
};
Option<int> portOption = new("port", new[] { "--port", "-p" })
{
Description = "Порт сервера (по умолчанию: 1771)",
DefaultValueFactory = parseResult => 1771
};
Option<string?> messageOption = new("message", new[] { "--message", "-m" })
{
Description = "Сообщение для отправки (если не указано, работает в интерактивном режиме)",
Arity = ArgumentArity.ZeroOrOne
};
var rootCommand = new RootCommand("Клиент для отправки строк серверу и получения их в обратном порядке")
{
ipOption,
portOption,
messageOption
};
rootCommand.Parse("--version").Invoke();
ParseResult parseResult = rootCommand.Parse(args);
if (parseResult.Errors.Count == 0)
{
string ip = parseResult.GetValue(ipOption) ?? "localhost";
int port = parseResult.GetValue(portOption);
string? message = parseResult.GetValue(messageOption);
try
{
if (!string.IsNullOrEmpty(message))
{
// Режим однократной отправки
await SendMessage(ip, port, message);
}
else
{
// Интерактивный режим
await RunInteractive(ip, port);
}
return 0;
}
catch (Exception ex)
{
Console.Error.WriteLine($"Ошибка: {ex.Message}");
return 2;
}
}
else
{
foreach (ParseError parseError in parseResult.Errors)
{
Console.Error.WriteLine(parseError.Message);
}
return 1;
}
}
static async Task SendMessage(string ip, int port, string message)
{
try
{
Console.WriteLine($"Подключение к {ip}:{port}...");
using var client = new TcpClient();
await client.ConnectAsync(ip, port);
Console.WriteLine("Подключено к серверу");
using var stream = client.GetStream();
// Отправка сообщения
var messageBytes = Encoding.UTF8.GetBytes(message + Environment.NewLine);
await stream.WriteAsync(messageBytes, 0, messageBytes.Length);
Console.WriteLine($"Отправлено: {message}");
// Чтение ответа
var buffer = new byte[1024];
var bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length);
if (bytesRead > 0)
{
var response = Encoding.UTF8.GetString(buffer, 0, bytesRead).TrimEnd('\n', '\r');
Console.WriteLine($"Получено: {response}");
}
}
catch (SocketException ex)
{
Console.WriteLine($"Сетевая ошибка: {ex.Message}");
throw;
}
}
static async Task RunInteractive(string ip, int port)
{
try
{
Console.WriteLine($"Подключение к {ip}:{port}...");
using var client = new TcpClient();
await client.ConnectAsync(ip, port);
Console.WriteLine("Подключено к серверу");
Console.WriteLine("Введите текст для отправки (или 'exit' для выхода):");
using var stream = client.GetStream();
var buffer = new byte[1024];
while (true)
{
// Чтение ввода пользователя
Console.Write("> ");
var input = Console.ReadLine();
if (string.IsNullOrWhiteSpace(input))
continue;
if (input.Equals("exit", StringComparison.OrdinalIgnoreCase))
{
Console.WriteLine("Завершение работы...");
break;
}
try
{
// Отправка сообщения
var messageBytes = Encoding.UTF8.GetBytes(input + Environment.NewLine);
await stream.WriteAsync(messageBytes, 0, messageBytes.Length);
// Чтение ответа
var bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length);
if (bytesRead > 0)
{
var response = Encoding.UTF8.GetString(buffer, 0, bytesRead).TrimEnd('\n', '\r');
Console.WriteLine($"Ответ: {response}");
}
else
{
Console.WriteLine("Сервер отключился");
break;
}
}
catch (Exception ex)
{
Console.WriteLine($"Ошибка при отправке/получении: {ex.Message}");
break;
}
}
}
catch (SocketException ex)
{
Console.WriteLine($"Ошибка подключения: {ex.Message}");
}
}
}
}