private async Task InvalidateChallengeToken(Server server)
        {
            var       request = RequestFormingService.HandshakeRequestPackage(server.SessionId);
            IResponse response;

            while (true)
            {
                response = await udpService.SendReceive(server, request);

                if (response is TimeoutResponse)
                {
                    if (ServersTimeoutCounters[server] > MaxTriesBeforeSocketInvalidate)
                    {
                        var delayTask = Task.Delay(RetryAwaitLongInterval);

                        server.InvalidateSocket();
                        ResetTimeoutCounter(server);

                        await delayTask;
                        continue;
                    }

                    ServersTimeoutCounters[server]++;
                    await Task.Delay(RetryAwaitShortInterval);

                    continue;
                }

                break;
            }

            byte[] challengeToken = ResposeParsingService.ParseHandshake((RawResponse)response);

            server.ChallengeToken.UpdateToken(challengeToken);
        }
        public async Task <ServerFullStateResponse> GetFullStatus(Server server)
        {
            if (!server.ChallengeToken.IsFine)
            {
                await InvalidateChallengeToken(server);
            }

            IResponse response;

            while (true)
            {
                var request = RequestFormingService.GetFullStatusRequestPackage(server.SessionId, server.ChallengeToken);
                response = await udpService.SendReceive(server, request);

                if (response is TimeoutResponse)
                {
                    if (ServersTimeoutCounters[server] > MaxTriesBeforeSocketInvalidate)
                    {
                        var delayTask = Task.Delay(RetryAwaitLongInterval);

                        server.InvalidateSocket();
                        var invalidateTask = InvalidateChallengeToken(server);
                        ResetTimeoutCounter(server);

                        Task.WaitAll(new Task[] { delayTask, invalidateTask });
                        continue;
                    }

                    ServersTimeoutCounters[server]++;
                    await Task.Delay(RetryAwaitShortInterval);

                    continue;
                }

                break;
            }

            var fullStateResponse = ResposeParsingService.ParseFullState((RawResponse)response);

            return(fullStateResponse);
        }