C# требуется совет. Реализация функционала обмена с сервером?
Как правильно реализовать момент?
Есть дескоптное приложение .NET - обменивается данными с сервером.
Хотелось бы чтобы после обмена данными с сервером оно подгружало скрипт - и запускало его, как такое реализуется?
Rasse, так можно сделать, но это очень сильная дыра в безопасности. Лучше свой протокол сделать.
Попытайтесь понять, какие именно вещи должен выполнять клиент
Rasse, Обменивается по Http?
Если да, то используйте HttpWebRequest (почитайте в MSDN). Как данные в него прилетят, так и запускайте любой C# код, какой хотите
Описание
Предназначен для простого вызова удаленных команд
Формат пакета
CMD int16 - тип пакета (1 выполнение команды, 2 выполнение power shell, 3 системная команда)
LEN int32 - длина тела пакета (0 и выше байт )
BODY byte[LEN] - нагрузка пакета должна быть согласована клиентом и сервером
CRC32 int32 - crc checksum of BODY
Среда передачи
Должна обеспечивать целостность пакета.
Пример сервера
class Program
{
static void Main(string[] args)
{
const string srv1 = "192.168.9.99";
const int port = 5007;
var si1 = new SeverInst(IPAddress.Parse(srv1), port);
si1.Start();
while (true)
{
si1.WaitAndStart();
}
}
}
public class ClientObject
{
public TcpClient Client;
public ClientObject(TcpClient tcpClient)
{
Client = tcpClient;
}
public void Process()
{
NetworkStream stream = null;
try
{
stream = Client.GetStream();
byte[] data = new byte[64]; // буфер для получаемых данных
while (true)
{
// получаем сообщение
var builder = new StringBuilder();
int bytes = 0;
do
{
bytes = stream.Read(data, 0, data.Length);
builder.Append(Encoding.Unicode.GetString(data, 0, bytes));
}
while (stream.DataAvailable);
string message = builder.ToString();
Console.WriteLine(message);
// отправляем обратно сообщение в верхнем регистре
message = message.Substring(message.IndexOf(':') + 1).Trim().ToUpper();
data = Encoding.Unicode.GetBytes(message);
stream.Write(data, 0, data.Length);
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
if (stream != null)
stream.Close();
if (Client != null)
Client.Close();
}
}
}
public class SeverInst
{
public TcpListener Listener { get; }
public SeverInst(IPAddress ip, int port )
{
Listener = new TcpListener(ip, port);
}
public void Start() => Listener.Start();
public void WaitAndStart()
{
var client = Listener.AcceptTcpClient();
var clientObject = new ClientObject(client);
// создаем новый поток для обслуживания нового клиента
var clientThread = new Thread(new ThreadStart(clientObject.Process));
clientThread.Start();
}
}