私は、コンピューター ラボで使用され、サービスとして機能するクライアント サーバー アプリケーションを作成しています (サービスとして実行する必要はありません)。コンソールの 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質問が明確であることを願っていますか?私が書いた質問のほとんどが不明確であることに気付きました。:/