سؤال

أنا أكتب تطبيق خادم عميل لاستخدامه في مختبر الكمبيوتر والعمل كخدمة (دون تشغيل كخدمة). لدي تطبيق وحدة التحكم في استدعاء الوظيفة الأصلية "ShowWindow" / sw_hide باستخدام كائن HWND في وحدة التحكم - هذا يعطي ذلك ما أريده هنا. يعمل الخادم / العميل، لقد أرسلت رسالة "Hello World!" من العميل إلى الخادم عدة مرات وأنا سعيد. (أنا أستخدم UDP لبروتوكول المقبس لأن قسم تكنولوجيا المعلومات يريد اتباع نهج بدون اتصال.)

سؤالي يكمن في "بروتوكول" للتواصل بين خادم العميل.

تتضمن الأهداف وراء الخادم ما يلي:

  • إمكانية الوصول، برمجيا، إلى قدرات معينة تم حظرها قسم تكنولوجيا المعلومات عن الأمن (مثل "Net.exe")
  • امنح الوصول إلى برنامجي لرصد ما ينظر إليه الطلاب في مختبر الكمبيوتر.

بعض الأشياء التي أرغب في تضمينها هي أسئلة بسيطة يتم إرسالها ذهابا وإيابا:

  • سيؤدي أمر "Requser" إلى إرجاع اسم المستخدم و FullName (كما هو مسموح به "مستخدم صافي" سابقا)
  • سيعود أمر "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

    }
}

ملاحظة: آمل أن يكون السؤال واضحا؟ لقد لاحظت معظم أسئلتي التي أكتبها غير واضحة. : /

هل كانت مفيدة؟

المحلول

Sslstream فئة من system.net.security قد تفعل ما تحتاجه

(SSLSTREAM) يوفر دفقا يستخدم في اتصال خادم العميل الذي يستخدم بروتوكول أمان Secure Socket Layer (SSL) للمصادقة على الخادم وخصم العميل اختياريا.

...

تساعد بروتوكولات SSL على توفير السرية والتحقق من النزاهة للرسائل المرسلة باستخدام SSLStream. يجب استخدام اتصال SSL، مثل تلك التي توفرها SSLStream، عند توصيل المعلومات الحساسة بين العميل والخادم. يساعد استخدام SSLStream على منع أي شخص من القراءة والعبث بالمعلومات أثناء العبور على الشبكة

مزيد من التفاصيل والأمثلة هنا: فئة sslstream

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top