2015-02-01 5 views
0

파일을 다운로드하여 서버에 연결해야합니다. 연결에 실패하면 루프를 다시 시작합니다. 어떻게 든 while 루프는 파일을 계속 실행하고 다운로드합니다. 부울과 함께 뭔가 이상한 일이 발생한다고 생각합니다. Globals.sockRetry하지만 실제로 일어나는 일을 찾을 수 없습니다.while 루프가 중단 된 후에도 계속 실행됩니다.

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; 
     } 
    } 
} 
+2

while 루프를 나가기위한 조건은 어디에 있습니까? 내가 볼 수 있듯이 while 루프는'continue'에서 끝나고 결코 빠져 나오지 못합니다. – OmniOwl

+0

알다시피, 새 질문을 다시 게시하는 대신 이전 질문을 편집 할 수있었습니다. – stakx

+0

다운로드가 성공하더라도 프로그램이 파일을 계속 다운로드한다는 의미입니까? 다운로드가 성공적 이었습니까? 성공 여부는 어떻게 확인 했습니까? – stakx

답변

5

유일한 곳이 당신이 루프를 종료가 여기에 있습니다 :

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

는 그래서 경우에만 Globals.sockRetry == true 발생합니다. 예외가 발생하는 경우에만 Globals.sockRetrytrue이 할당됩니다. 예외가 발생하지 않으면 루프는 끝나지 않습니다. 이 같은

변경을 :

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

연결할 그렇지 않으면 후에는 예외가 (희망) 슬로우 될 때까지 다시 다시 연결 한 것입니다.

+0

Globals.sockRetry는 false입니다. t 예외가 있으면 연결되고 ReadLine 함수는 while 회선을 해당 회선에서 사용 중으로 유지합니다. 내가 뭘 놓치고있어? – Kenny

+0

'ReadLine'은 조만간 false를 반환 할 것이지만 무한 루프에서'connect'를 호출합니다. 그리고'connect'는'ReadLine'을 호출합니다. 몇 번이나 연결해야합니까? –

+0

다른 버그입니다. 감사합니다! 나는 그것을 고쳐 줄 것이다. – Kenny

1

continue 루프에서 다음 반복이 계속됩니다. break은 루프를 중지합니다. 따라서 루프는 끝나지 않습니다. 당신은 루프를 중지 할 때이 할 수 있도록

당신은, sockRetryfalse에 설정 : while (sockRetry)

+0

나는 break를 사용하여 연결 루프를 중지하고 파일을 다시 다운로드합니다. – Kenny

0

내가이 버그를 재현 할 수 아니에요을, 어쩌면이 질문은 지역 사회에 쓸모으로 삭제해야 .

+0

그냥 삭제하십시오, 당신은 그것을 할 수 있습니다 귀하의 게시물 – sam

+0

@ 샘 그것이 그것에 의견이 있으면 나는 할 수 없어. 나중에 사회자에게 물어볼 것입니다. – Kenny

관련 문제