Сервер-клиент с динамическим IP-адресом - PullRequest
0 голосов
/ 06 сентября 2018

У меня есть серверное приложение, встроенное в C #, которое прослушивает TCP-порт и получает некоторые пакеты данных от клиентов. Проблема в том, что есть клиенты с динамическим IP-адресом, поэтому в данный момент у меня есть один клиент с большим количеством открытых соединений. Мне нужен способ определить, когда клиент изменил свой ip и закрыть старое соединение.

List<Socket> ClientsToRemove = new List<Socket>();

       ---this foreach this to avoid connections with the same ip address---                 
                   foreach(Socket client1 in AllConnections)
                    {
                        int count = 0;
                        foreach(Socket client2 in AllConnections)
                        {
                            if(((IPEndPoint)client1.RemoteEndPoint).Address.ToString() == ((IPEndPoint)client2.RemoteEndPoint).Address.ToString())
                            {
                                count++;
                            }
                        }
                        if(count>1)
                        {
                            AllConnections.Remove(client1);
                            UpdateActiveConnectionsBox(AllConnections.Count.ToString());
                        }
                    }

                   ---verify active connections---
                   foreach (Socket client in AllConnections)
                    {
                        if (!client.IsConnected())
                        {
                            ClientsToRemove.Add(client);
                        }
                        else
                        {
                            UpdateLogBox("Active client IP:" + ((IPEndPoint)client.RemoteEndPoint).Address.ToString());
                        }    
                    }
                    UpdateLogBox("ACtive connection numer: " + AllConnections.Count.ToString());
                    foreach (Socket client in ClientsToRemove)
                        if (AllConnections.Contains(client))
                            AllConnections.Remove(client);

                    ClientsToRemove.Clear();
                    ClientsToRemove = null;

                    UpdateActiveConnectionsBox(AllConnections.Count.ToString());
                    Thread.Sleep(1500);

И здесь я принимаю новые подключения:

ServerMainSocket.Listen(10);
Socket TempSock = ServerMainSocket.Accept();
Task.Factory.StartNew(() => { ClientFunction(TempSock); });

UpdateLogBox("New client connected from IP:" + ((IPEndPoint)TempSock.RemoteEndPoint).Address.ToString());

if(AllConnections.Contains(TempSock) != true)
{ 
    AllConnections.Add(TempSock);
}
else
{
    AllConnections.Remove(TempSock);
    AllConnections.Add(TempSock);

    UpdateActiveConnectionsBox(AllConnections.Count.ToString());
}
...