C # Уникальный идентификатор для подключения клиента сервера tcp / ip - PullRequest
0 голосов
/ 28 июня 2018

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

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

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

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

1 Ответ

0 голосов
/ 28 июня 2018

Вы можете использовать IPEndPoint Метод адреса для получения удаленного 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);
    }
}
...