С# Уникальный идентификатор для подключения клиента к серверу tcp/ip

ниже примерно то, как я обычно делаю, пытаясь установить соединение на моем сервере с моим 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-адрес сервера и номер порта. Теперь я хочу выполнить фильтрацию клиентского устройства. Только определенное клиентское устройство может подключиться к моему серверу.

Можем ли мы вставить уникальный идентификатор клиенту, чтобы клиент только с этим уникальным идентификатором мог подключиться к моему серверу? Как мы можем гарантировать, что клиент именно тот, который нам нужен?

Это сделано из соображений безопасности, чтобы предотвратить подключение неавторизованного клиента к серверу.


person Coolguy    schedule 28.06.2018    source источник


Ответы (1)


Вы можете использовать метод IPEndPoint Address, чтобы получить удаленный IP-адрес и создать белый список, чтобы проверить, кто может подключиться к вашему серверу.

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


-------------------------------------------------------------- -------------------------------------------------- ----------------------------------
Обновлено:
Я не уверен, что Csharp Socket проверен метод устройства или нет. Но у меня есть метод ниже.
Используйте 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);
    }
}
person Oliver    schedule 28.06.2018
comment
Оливер, спасибо за комментарий. Но есть ли такой метод, как сопряжение для bluetooth, где есть уникальный идентификатор? - person Coolguy; 28.06.2018
comment
Оливер, я боюсь, что как только неавторизованный клиент узнает IP-адрес из белого списка, который мы использовали, он уже может подключиться. Существует ли такой метод, как клиент должен предоставить уникальный идентификатор серверу, и если уникальный идентификатор совпадает с сервером , то он может подключиться. - person Coolguy; 28.06.2018
comment
@Coolguy Клиент должен подключиться к вашему серверу перед отправкой данных на ваш сервер, и я также обновил свой ответ. - person Oliver; 28.06.2018
comment
Оливер, я ценю твой ответ. Но что, если клиент не отправляет никакого уникального идентификатора? Что, если клиент просто подключится и анонимно прослушает сервер... Я не хочу, чтобы это произошло. Это мы должны установить какой-то таймер для клиента, чтобы отправить идентификатор. Если сервер не получит идентификатор в течение определенного периода времени, он отключит клиента. - person Coolguy; 30.06.2018