문제

컴퓨터 실에서 사용할 클라이언트-서버 응용 프로그램을 작성하고 서비스 역할을합니다 (서비스로 실행하지 않고). 콘솔의 HWND 객체를 사용하여 기본 기능을 "showwindow"/sw_hide라고하는 콘솔 응용 프로그램이 있습니다. 서버/클라이언트가 작동하고 있으며 "Hello World!"메시지를 보냈습니다. 클라이언트에서 서버로 여러 번, 기뻐요. (IT 부서는 연결이없는 접근 방식을 원하기 때문에 소켓 프로토콜에 UDP를 사용하고 있습니다.)

내 질문은 클라이언트 서버 간의 커뮤니케이션을위한 '프로토콜'에 있습니다.

서버의 목표에는 다음이 포함됩니다.

  • 우리의 IT 부부가 보안을 위해 차단 한 특정 능력에 대해 프로그래밍 방식으로 접근 할 수 있습니다 (예 : "net.exe")
  • 내 프로그램에 액세스하여 학생들이 컴퓨터 실에서보고있는 것을 모니터링하십시오.

내가 포함하고 싶은 것은 간단한 질문입니다.

  • "Requser"의 명령은 사용자 이름과 풀 이름을 반환합니다 (이전에 "Net User"가 허용하는대로 이전에)
  • "ReqProcs"의 명령은 현재 사용자의 사용자 이름에 따라 현재 실행중인 프로세스 목록을 반환합니다.

의심 할 여지가 없습니다. 내가 지금 당장 러브하는 것은 데이터 안전입니다. 우리는 대학에 "해커"가 있습니다.이 대학에는 악의적 인 일을하거나 적 또는 그 내용에 대한 정보를 얻기 위해 특정 서버로 패킷을 재판매 할 수있는 방법을 알고있는 몇 가지 "해커"가 있습니다.

내 생각은 전송 된 모든 데이터에 대한 암호화 체계를 제공하고 수신에 해독하는 것이 었습니다.

내가 말한 친구는 비트 패커를 사용해야한다고 말했고 나는 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

    }
}

추신 : 질문이 분명하기를 바랍니다. 내가 쓰는 대부분의 질문이 불분명하다는 것을 알았습니다. :/

도움이 되었습니까?

해결책

System.net.security의 sslstream 클래스는 필요한 일을 할 수 있습니다

(SSLSTREAM)은 SSL (Secure Socket Layer) 보안 프로토콜을 사용하여 서버와 선택적으로 클라이언트를 인증하는 클라이언트 서버 통신에 사용되는 스트림을 제공합니다.

...

SSL 프로토콜은 SSLSTREAM을 사용하여 전송 된 메시지에 대한 기밀성 및 무결성 검사를 제공하는 데 도움이됩니다. SSLStream에서 제공하는 것과 같은 SSL 연결은 클라이언트와 서버간에 민감한 정보를 통신 할 때 사용해야합니다. sslstream을 사용하면 네트워크에서 통과하는 동안 정보를 읽거나 변조하는 것을 방지 할 수 있습니다.

자세한 내용 및 예제 : sslstream 클래스

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top