async Task HandShakeHandle(HandShake msg, IPEndPoint endPoint)
 {
     if (CompareIpEndPoints(ConnectServers, msg.KnownIpEndPoints))
     {
         return;
     }
     lock (ConnectServers)
     {
         ConnectServers = UnionEndpoints(ConnectServers, msg.KnownIpEndPoints);
     }
     await BroadcastEndPointsAsync();
 }
        async Task NewConnection(IPEndPoint ipEndPoint, MessageType type)
        {
            var list = type switch
            {
                MessageType.HandShake => ConnectServers,
                MessageType.SurfaceHandShake => ConnectSurfaces,
                _ => null
            };

            if (list is null)
            {
                return;
            }
            lock (list)
            {
                if (list.Any(x => Equals(x.Address, ipEndPoint.Address)))
                {
                    return;
                }
                list.Add(ipEndPoint);
            }
            _logger.LogInformation($"Server: New Connection from {ipEndPoint} > {type}");
            if (type != MessageType.HandShake)
            {
                return;
            }
            try
            {
                await SendMessageAsync(ipEndPoint.Address, NetworkConstant.SERVER_PORT, HandShake.CreateMessage(ConnectServers));
            }
            catch (SocketException)
            {
                RemoveEndPoint(ipEndPoint, list);
                await BroadcastEndPointsAsync();
            }
        }

        Task MessageHandle(Message msg, IPEndPoint endPoint)
        {
            _logger.LogInformation($"Server: Message has arrived from {endPoint} : MSG_TYPE: {msg.Type} : {DateTime.Now:ss.FFFF}");
            return(msg.Type switch
            {
                MessageType.HandShake => HandShakeHandle(JsonSerializer.Deserialize <HandShake>(msg.Payload), endPoint),
                MessageType.Addr => AddrHandle(JsonSerializer.Deserialize <AddrPayload>(msg.Payload), endPoint),
                MessageType.Inventory => Task.CompletedTask,
                MessageType.Notice => Task.CompletedTask,
                MessageType.Ping => Task.CompletedTask,
                MessageType.SurfaceHandShake => SurfaceHandShakeHandle(endPoint),
                _ => Task.CompletedTask
            });
        }
 public async Task ConnectAsync(IPEndPoint endPoint)
 {
     try
     {
         await SendMessageAsync(endPoint.Address, NetworkConstant.SERVER_PORT, HandShake.CreateMessage(ConnectServers));
     }
     catch (SocketException)
     {
         _logger.LogInformation($"Server: {endPoint} > No response");
     }
 }