Kenny
Kenny

Reputation: 1142

While loop keeps running after break

I need to download a file and use it to connect to a server. If the connection fails, it restarts the loop. Somehow the while loop keeps running and downloading the file constantly. I think that something weird happens with the boolean Globals.sockRetry but I can't find what's really happening.

public class Globals
{
    public static string serverIp;
    public static int serverPort;

    public static int sockConn = 0;
    public static bool sockRetry = false;

    public static TcpClient client;
    public static NetworkStream nwStream;
    public static StreamReader reader;
    public static StreamWriter writer;
}

static void connect(Globals g)
{
    Globals.sockConn = 1;

    try
    {
        Globals.client = new TcpClient(Globals.serverIp, Globals.serverPort);
        Globals.nwStream = Globals.client.GetStream();
        Globals.reader = new StreamReader(Globals.nwStream);
        Globals.writer = new StreamWriter(Globals.nwStream);

        Globals.sockConn = 2;

        string inputLine;

        while ((inputLine = Globals.reader.ReadLine()) != null)
        {
            // ParseMessage(Globals.writer, inputLine, g);
        }
    }
    catch
    {
        Globals.sockRetry = true;
        Globals.sockConn = 0;
        return;
    }
}

static void getInfo()
{
    while (true)
    {
        try
        {
            WebRequest request = WebRequest.Create(INFO_HOST + INFO_PATH);
            WebResponse response = request.GetResponse();

            string content;
            using (var sr = new StreamReader(response.GetResponseStream()))
            {
                content = sr.ReadToEnd();
            }

            string[] contentArray = content.Split(':');

            string serverIp = contentArray[0];
            string serverPortStr = contentArray[1];

            int serverPort = 5000;
            Int32.TryParse(serverPortStr, out serverPort);

            Globals g = new Globals();
            Globals.serverIp = serverIp;
            Globals.serverPort = serverPort;

            while (Globals.sockConn == 0)
            {
                if (Globals.sockRetry == false)
                {
                    connect(g);
                }
                else
                {
                    // error connecting
                    // wait and retry
                    Globals.sockRetry = false;
                    Thread.Sleep(60000);
                    break;
                }
            }

            continue;
        }
        catch
        {
            // error downloading file
            // wait and retry
            Thread.Sleep(60000);
            continue;
        }
    }
}

Upvotes: 0

Views: 385

Answers (2)

joppiesaus
joppiesaus

Reputation: 5760

continue continues to the next iteration in the loop. break stops the loop. So, the loop never ends.

You set sockRetry to false when you want to stop the loop, so you could do this: while (sockRetry)

Upvotes: 1

Nadia Chibrikova
Nadia Chibrikova

Reputation: 5036

The only place there you terminate the loop is here:

if (Globals.sockRetry == false)
            {
                connect(g);
            }
            else
            {
                ...
                break;
            }

So it happens only if Globals.sockRetry == true. Globals.sockRetry is assigned true only if an exception is thrown. If no exception is thrown, the loop never ends.

Change it like this:

   if (Globals.sockRetry == false)
            {
                connect(g);
                break;
            }

Otherwise after you connect you will connect again, and then again till an exception is thrown (hopefully).

Upvotes: 5

Related Questions