2013-08-22 30 views
0

我有辦法告訴TCP客戶端反覆連接,如果一個布爾是真的,但我不知道這是否是一個好方法它,因爲我幾乎告訴它一遍又一遍,並忽略錯誤。TCP自動重新連接(永遠直到用戶告訴它停止)

但我也不知道有任何其他的方式來做到這一點。

但也許你們這樣做,這裏是代碼的一部分:

while (capcon == true) 
    { 

     using (tcp = new TcpClient()) 
     { 
      tcp.NoDelay = true; 
      try 
      { 
       if (!tcp.Connected) 
        tcp.Connect(adress); 
      } 
      catch (Exception e) 
      { 
       if (e is SocketException || e is IOException) { } 
       else 
        MessageBox.Show(e.Message + " Tcp Connect : Send"); 

      } 
      using (var ms = new MemoryStream()) 
      { 
       Stoptimer = new Stopwatch(); 
       int i = 0; 
       while (tcp.Connected && capcon == true) 
       { 
        try 
        { 
         FastMethods.CaptureBitBit(hwnd, JpegParam, jpeg, ms); 
         if (bsize != ms.Length && tcp.Connected) 
         { 
          bsize = ms.Length; 
          Stoptimer.Start(); 

          tcp.GetStream().Write(BitConverter.GetBytes(bsize), 0, intsize); 

          tcp.GetStream().Write(ms.GetBuffer(), 0, (int)bsize); 
          //i++; 
          //tcp.GetStream().Write(rv, 0, rv.Length); 
          if (i > 100) 
          { 
           i = 0; 
           Stoptimer.Stop(); 
           Console.WriteLine(Stoptimer.ElapsedTicks); 
           Stoptimer = new Stopwatch(); 
          } 

         } 
         ms.SetLength(0); 

        } 

        catch (Exception e) 
        { 
         if (e is SocketException || e is IOException) 
         { 
          break; 
         } 
         else 
         { 
          MessageBox.Show(e.Message + ": Send Error"); 
         } 
        } 
       } 
      } 
     } 
    } 

好吧,你可以看到,it's一個爛攤子,但it's我得到了什麼。

+0

你錯過了你實際上停止嘗試連接的部分(當連接成功時)... – legrandviking

+0

當它成功時,它會繼續將代碼放到另一個while循環中,並在那裏做它的東西。如果連接失敗,它會中斷,使其運行到先前的While循環,這將告訴它重新連接。 – Zerowalker

+0

忽略異常從來就不是好主意。一些表示可以通過重試恢復的條件:有些不會。 – EJP

回答

0

不知道我會用嵌套while()做到這一點,也許將連接邏輯分解爲單獨的方法並在需要時調用它,但這只是可維護性的首選。 我也希望記錄你的套接字相關的異常,因爲你的斷開連接是你可以修復的東西(如果你不知道它們是由什麼引起的,你沒有希望阻止它們)。

您是否注意到性能問題或只是要求「最佳實踐」?如果是這樣,Code review可能會感興趣。

+0

你能舉一個例子說明你會怎麼做嗎? 嗯,爲什麼我這樣做並不是螞蟻真正的問題本身,它只是爲了,容易/懶惰。嗯真的,沒有想到這一點。 – Zerowalker