0

私は、コンピューター ラボで使用され、サービスとして機能するクライアント サーバー アプリケーションを作成しています (サービスとして実行する必要はありません)。コンソールの HWND オブジェクトを使用してネイティブ関数「ShowWindow」/SW_HIDE を呼び出すコンソール アプリケーションがあります。これにより、ここで必要なものが得られます。サーバー/クライアントは動作しています。「Hello world!」というメッセージを送信しました。クライアントからサーバーに何度も送信され、満足しています。(IT 部門がコネクションレスのアプローチを望んでいるため、ソケット プロトコルに UDP を使用しています。)

私の質問は、クライアント サーバー間の通信の「プロトコル」にあります。

サーバーの背後にある目標には、次のものが含まれます。

  • IT部門がセキュリティのためにブロックした特定の機能(「net.exe」など)へのアクセスをプログラムで許可します
  • 私のプログラムへのアクセスを許可して、学生がコンピューター室で何を見ているかを監視してください。

含めたいのは、やり取りされる簡単な質問です。

  • 「REQUSER」のコマンドは、ユーザー名とフルネームを返します (以前は「net user」で許可されていました)。
  • 「REQPROCS」のコマンドは、現在のユーザーのユーザー名で現在実行されているプロセスのリストを返します。

私はこれを行うことができることに疑いの余地はありません。現時点で私が気になっているのは、データの安全性です。私の大学には何人かの「ハッカー」がいて、パケットを盗聴する方法を知っていて、パケットを特定のサーバーに再送信して、悪意のあることをしたり、敵に関する情報を取得したりできます。

私の考えは、送信されるすべてのデータに暗号化スキームを提供し、受信時にそれをデコードすることでした。

私が話した友人は、ビット パッカーを使用する必要があると言い、私は彼の BitPacker クラスを C++ から C# に移植し始めました。

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

    }
}

PS質問が明確であることを願っていますか?私が書いた質問のほとんどが不明確であることに気付きました。:/

4

1 に答える 1

2

System.Net.Security の SslStream クラスは、必要なことを行う可能性があります

(SslStream) Secure Socket Layer (SSL) セキュリティ プロトコルを使用してサーバーとオプションでクライアントを認証するクライアント サーバー通信に使用されるストリームを提供します。

...

SSL プロトコルは、SslStream を使用して送信されるメッセージの機密性と整合性チェックを提供するのに役立ちます。クライアントとサーバー間で機密情報を通信する場合は、SslStream によって提供されるような SSL 接続を使用する必要があります。SslStream を使用すると、ネットワーク上で転送中の情報の読み取りや改ざんを防ぐことができます。

詳細と例はこちら: SslStream クラス

于 2009-11-13T21:47:19.113 に答える