TCP / IP服务器客户端连接的C#唯一ID

时间:2018-06-28 04:38:09

标签: c# .net sockets tcp-ip tcplistener

以下大致是我尝试使用小型设备在服务器上建立连接时的通常操作:

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的客户端可以连接到我的服务器? 我们如何确保客户是我们想要的特定客户?

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

1 个答案:

答案 0 :(得分:0)

您可以使用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);
    }
}