private void ContinuousNATPunchthrough(BackgroundNATPunchthrough punchthrough)
        {
            var natPunchthroughApi = new NATPunchthroughApi();

            natPunchthroughApi.Configuration.ApiKey["api_key"] = punchthrough.UserSession.ApiKey;

            while (!punchthrough.ShouldStop)
            {
                var udpClient = punchthrough.UdpClient;

                while (true)
                {
                    NATNegotation negotation;
                    try
                    {
                        negotation = natPunchthroughApi.PunchthroughPut(punchthrough.UserSession.Id);
                    }
                    catch
                    {
                        continue;
                    }

                    if (negotation.Port == null)
                    {
                        throw new InvalidOperationException();
                    }

                    udpClient.Send(
                        negotation.Message,
                        negotation.Message.Length,
                        negotation.Host,
                        negotation.Port.Value);

                    Thread.Sleep(1000);

                    try
                    {
                        if (natPunchthroughApi.PunchthroughGet(punchthrough.UserSession.Id) == true)
                        {
                            // NAT punchthrough completed successfully.
                            continue;
                        }
                    }
                    catch
                    {
                        continue;
                    }

                    Thread.Sleep(1000);
                }
            }
        }
        private void ContinuousNATPunchthrough(BackgroundNATPunchthrough punchthrough)
        {
            var natPunchthroughApi = new NATPunchthroughApi();
            natPunchthroughApi.Configuration.ApiKey["api_key"] = punchthrough.UserSession.ApiKey;

            while (!punchthrough.ShouldStop)
            {
                var udpClient = punchthrough.UdpClient;

                while (true)
                {
                    NATNegotation negotation;
                    try
                    {
                        negotation = natPunchthroughApi.PunchthroughPut(punchthrough.UserSession.Id);
                    }
                    catch
                    {
                        continue;
                    }

                    if (negotation.Port == null)
                    {
                        throw new InvalidOperationException();
                    }

                    udpClient.Send(
                        negotation.Message,
                        negotation.Message.Length,
                        negotation.Host,
                        negotation.Port.Value);

                    Thread.Sleep(1000);

                    try
                    {
                        if (natPunchthroughApi.PunchthroughGet(punchthrough.UserSession.Id) == true)
                        {
                            // NAT punchthrough completed successfully.
                            continue;
                        }
                    }
                    catch
                    {
                        continue;
                    }

                    Thread.Sleep(1000);
                }
            }
        }