Frage

Ich schreibe eine Client-Server-Anwendung als Dienst in einem Computerlabor und Tat verwendet werden (ohne als Dienst ausgeführt wird). Ich habe eine Anwendung Konsole die native Funktion „Showwindow“ / SW_HIDE mit der Konsole des HWND-Objekts aufrufen - das gibt es, was ich hier bin zu wollen. Der Server / Client arbeitet, ich habe die Nachricht gesendet „Hallo Welt!“ vom Client an den Server viele Male und ich bin zufrieden. (Ich bin mit UDP für das Socket-Protokoll, da die IT-Abteilung eines verbindungslosen Ansatz will.)

Meine Frage liegt in einem 'Protokoll' für die Kommunikation zwischen Client-Server.

Die Ziele hinter dem Server gehören die folgenden:

  • der Zugang, programmatisch auf bestimmte Fähigkeiten, die unsere IT-Abteilung für Sicherheit blockiert hat (zum Beispiel „net.exe“)
  • der Zugang zu meinem Programm zu überwachen, was die Schüler im Computerlabor sehen.

Manches möchte ich schließen sind einfache Fragen hin und her gesendet:

  • Ein Befehl von „REQUSER“ zurückkehren würde den Benutzernamen und Fullname (wie „net user“ erlaubt vorher)
  • Ein Befehl von „REQPROCS“ würde eine Liste von Prozessen, die aktuell RAN unter Benutzername des aktuellen Benutzers zu sein.

Ich habe keinen Zweifel, ich bin in der Lage, dies zu tun. Das, was ich von zur Zeit leary bin, ist die Datensicherheit. Wir haben einig „Hacker“ hier an meiner Hochschule, die wissen, wie man Paket schnuppern und in der Lage sein, Pakete entweder bösartige Dinge tun, um bestimmten Server zu senden oder Informationen über einen Feind zu bekommen oder Dingsbums.

Mein Gedanke war, ein Verschlüsselungsschema auf allen Daten abgeschickt zur Verfügung zu stellen und dekodieren es auf erhalten.

Ein Freund, der ich gesprochen habe, sagte ich ein wenig Packer verwenden sollte, und ich begann seine Bitpacker Klasse von C ++ zu portieren zu C #, die ich mit bekam verwirrt und kam hier, um zu sehen, was Stackoverflow dachte.

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. Ich hoffe, die Frage klar ist? Ich habe die meisten meiner Fragen bemerkte ich schreiben, sind unklar. : /

War es hilfreich?

Lösung

SslStream Klasse von System.Net.Security könnte tun, was Sie brauchen

  

(SslStream) einen Strom verwendet für   Client-Server-Kommunikation, dass Verwendungen   die Secure Socket Layer (SSL)   Protokoll zur Authentifizierung des Servers   und gegebenenfalls die Auftraggeber.

...

  

SSL-Protokolle helfen zu schaffen   Vertraulichkeit und Integritätsprüfung   für Nachrichten übermittelt eine mit   SslStream. Eine SSL-Verbindung, wie   dass durch SslStream vorgesehen ist, sollte   verwendet, wenn empfindliche kommunizierte   Informationen zwischen einem Client und einem   Server. ein SslStream Mit hilft   Verhindern, dass jemand aus dem Lesen und   Manipulationen an Informationen, während es   auf der Durchreise auf dem Netzwerk

Weitere Informationen und Beispiele hier: SslStream Klasse

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top