用于 tcp/ip 服务器客户端连接的 C# 唯一 ID



以下是我尝试使用我的 slient 设备在我的服务器上建立连接时通常的做法:

IPEndPoint localEP = new IPEndPoint(IPAddress.Any, nConst3rdPartyPort);
the3rdPartyListener = new Socket(localEP.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
the3rdPartyListener.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
the3rdPartyListener.Bind(localEP);
the3rdPartyListener.Listen(100);
the3rdPartyListener.BeginAccept(new AsyncCallback(AcceptConnectBack), the3rdPartyListener);

任何客户端设备如果知道服务器 IP 和端口号,都可以连接到我的服务器。 现在,我想对客户端设备进行过滤。只有特定的客户端设备可以连接到我的服务器。

是否可以向客户端插入唯一 ID,以便只有该唯一 ID 的客户端可以连接到我的服务器? 我们如何确保客户端是我们想要的特定客户端?

这是出于安全原因,以防止未经授权的客户端连接到服务器。

您可以使用IPEndPoint地址方法检索远程 IPAddress,并创建白名单以检查谁可以连接您的服务器。

string clientIP = ((IPEndPoint)(the3rdPartyListener.RemoteEndPoint)).Address.ToString();


------------------------------------------------------------------------------------------------------------------------------------
更新:
我不确定Csharp套接字是否已验证设备方法。但我在下面有一个方法。
使用NetworkStream将数据从客户端传递到验证客户端的服务器。

服务器端:

TcpClient client;
TcpListener server;
Thread thread;
Thread threadTwo;
byte[] datalength = new byte[4];
public Server()
{
InitializeComponent();
server = new TcpListener(IPAddress.Any, 2018);
server.Start();
thread = new Thread(() =>
{
client = server.AcceptTcpClient();
ServerReceive();
}
thread.Start();
}
void ServerReceive()
{
networkStream = client.GetStream();
threadTwo = new Thread(() =>
{
while ((i = networkStream.Read(datalength, 0, 4)) != 0)
{
byte[] data = new byte[BitConverter.ToInt32(datalength, 0)];
networkStream.Read(data, 0, data.Length);
this.Invoke((MethodInvoker)delegate
{
if(Encoding.Default.GetString(data) == "unique ID")
{
//Do your job
}
}
}
}
threadTwo.Start();
}

客户端:

NetworkStream networkStream;
TcpClient client;
byte[] datalength = new byte[4];
public Client()
{
InitializeComponent();
try
{
client = new TcpClient("your server ip", 2018);
ClientSend("unique ID");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
void ClientSend(string msg)
{
try
{
networkStream = client.GetStream();
byte[] data;
data = Encoding.Default.GetBytes(msg);
int length = data.Length;
byte[] datalength = new byte[4];
datalength = BitConverter.GetBytes(length);
networkStream.Write(datalength, 0, 4);
networkStream.Write(data, 0, data.Length);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}

最新更新