Я пишу клиент-серверное приложение, которое будет использоваться в компьютерном классе и работать в качестве службы (без запуска в качестве службы). У меня есть консольное приложение, вызывающее нативную функцию «ShowWindow» / SW_HIDE с использованием консольного объекта HWND - это дает мне то, что я хочу здесь. Сервер / клиент работает, я отправил сообщение "Hello world!" с клиента на сервер много раз и мне приятно. (Я использую UDP для протокола сокетов, потому что ИТ-отделу нужен подход без установления соединения.)
Мой вопрос заключается в «протоколе» для связи между клиентом и сервером.
Цели, стоящие за сервером, включают следующее:
- Предоставить программный доступ к некоторым возможностям, которые наш ИТ-отдел заблокировал для обеспечения безопасности (например, "net.exe")
- Предоставьте доступ к моей программе, чтобы следить за тем, что студенты просматривают в компьютерной лаборатории.
Некоторые вещи, которые я хочу включить, - это простые вопросы, отправляемые туда и обратно:
- Команда «REQUSER» вернет имя пользователя и полное имя (как ранее разрешалось «net user»)
- Команда "REQPROCS" вернет список процессов, которые в данный момент выполняются под именем пользователя текущего пользователя.
Я не сомневаюсь, что смогу это сделать. На данный момент меня беспокоит безопасность данных. Здесь, в моем колледже, есть несколько «хакеров», которые могут знать, как перехватывать пакеты и иметь возможность пересылать пакеты на определенные серверы, чтобы либо совершать вредоносные действия, либо получать информацию о враге или чем-то еще.
Я думал о том, чтобы обеспечить схему шифрования для всех отправленных данных и декодировать их при получении.
Друг, с которым я говорил, сказал, что мне следует использовать упаковщик битов, и я начал переносить его класс BitPacker с C ++ на C #, с которым я запутался, и пришел сюда, чтобы посмотреть, что думает Stackoverflow.
namespace Atlantis.Net.Sockets
{
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Windows.Forms;
public class UdpServer : System.Net.Sockets.UdpClient
{
#region Constructor(s)
public UdpServer(Int32 port)
: base(port)
{
}
public UdpServer(IPEndPoint endPoint)
: base(endPoint)
{
}
#endregion
#region Properties
private Int32 m_Backlog = 32;
/// <summary>
/// Sets how many active connections the socket can support
/// </summary>
public Int32 Backlog
{
private get
{
return m_Backlog;
}
set
{
m_Backlog = value;
}
}
private Boolean m_IsInitialized = false;
/// <summary>
/// Gets a value indicating whether the server has been initialized
/// </summary>
public Boolean IsInitialized
{
get
{
return m_IsInitialized;
}
private set
{
m_IsInitialized = value;
}
}
private Int32 m_Port = 1337;
/// <summary>
/// Sets the port number for listening for incoming connections
/// </summary>
public Int32 Port
{
private get
{
return m_Port;
}
set
{
m_Port = value;
}
}
private Encoding m_Encoding = Encoding.ASCII;
/// <summary>
/// Gets or sets the text encoding for data being transferred to/from the server
/// </summary>
public Encoding Encoding
{
get
{
return m_Encoding;
}
set
{
m_Encoding = value;
}
}
#endregion
#region Events
public event EventHandler<UdpReceiveEventArgs> DataReceive;
#endregion
#region Methods
protected virtual void OnDataRecieve(String data, object state)
{
if (DataReceive != null)
{
DataReceive(this, new UdpReceiveEventArgs(data, ((UdpState)state)));
}
}
private void DataReceiveCallback(IAsyncResult ar)
{
UdpClient u = (UdpClient)((UdpState)ar.AsyncState).host;
IPEndPoint e = (IPEndPoint)((UdpState)ar.AsyncState).endPoint;
Byte[] data = u.EndReceive(ar, ref e);
OnDataRecieve(Encoding.GetString(data), ((UdpState)ar.AsyncState));
UdpState state = new UdpState();
state.endPoint = new IPEndPoint(IPAddress.Any, Port);
state.host = u;
u.BeginReceive(new AsyncCallback(DataReceiveCallback), ((UdpState)ar.AsyncState));
}
/// <summary>
/// .
/// </summary>
public void Initialize()
{
if (IsInitialized)
{
return;
}
//Debug.WriteLine(String.Format("Local address and port : {0}", Client.RemoteEndPoint.ToString()));
UdpState state = new UdpState();
state.endPoint = new IPEndPoint(IPAddress.Any, Port);
state.host = this;
BeginReceive(new AsyncCallback(DataReceiveCallback), state);
IsInitialized = true;
}
#endregion
}
}
P.S. Надеюсь вопрос понятен? Я заметил, что большинство моих вопросов, которые я пишу, неясны. : /