2012-06-25 159 views
1

背景:我的應用程序可以選擇自動檢查網絡上的設備是否連接到網絡。TCP客戶端和套接字問題

如果設備未連接,則表示爲藍色正方形,並且表示連接的綠色正方形。我已經對這個程序進行了比較徹底的測試,並且有幾組不同的數據需要查看;

如果設備開始斷開連接,我可以連接,然後斷開,從藍色,綠色,藍色,但在此之後停止運作。

如果設備開始連接,我可以斷開連接,但不能再次連接,所以這會從綠色變爲藍色,但隨後停止運行。

下面是一些代碼片段,顯示我如何連接到這些(這不是異步的,因爲一些設備沒有回調(?));

TcpClient _tc = new TcpClient(); 
if (!_tc.Client.Connected) 
      { 
       try 
       { 
        _tc.Client.Connect(device.deviceIPAddress, device.devicePort); 
        _tc.Client.ReceiveTimeout = 10; 
       } 
       catch 
       { 
        if (deviceDownNotified == false) 
        { 

         //do stuff to notify me 

        } 
       } 

      } 


      if (_tc.Client.Connected) 
       { 
        tcpSet = true; 
        try 
        { 
         result = this.SendCommandResult(bData, 72); 

         if (result[0] == 0xF0 && result[1] == 0xF0 && result[2] == 0x00 && result[3] == 0x02 && result[68] == 0xF0 && result[69] == 0xF0) 
         { 

          CheckChanges(result, device, exit); 
          deviceDownNotified = false; 

         } 
        } 
        catch 
        { 

        } 


       } 

編輯:另外我只是在想,我真的沒有必要手動斷開連接。如果一個客戶端沒有連接,那麼連接,如果是的話,然後做東西。我有點困惑,它在哪個狀態之間切換一次,然後停止工作。

我想我的問題可能是由於我斷開插座/客戶端的方式,如果設備斷開連接。有人有主意嗎?如果您需要更多信息,只需詢問。

編輯2:我有線了一個重新連接按鈕,我手動點擊時,它應該重新連接,我收到以下錯誤異常:

「一旦插座已經斷開,只能重新再異步的,只有到一個不同的終點,必須在一個線程上調用BeginConnect,直到操作完成纔會退出。「

回答

0

解決了我自己的問題。最後。這裏有一些信息供讀者閱讀,可能正在尋找解決方案。

從我收集的內容來看,當TCP連接中斷時,您必須創建一個新連接,因爲無法以這種方式重新連接或重新使用連接。我所做的是這樣的:

(從代碼在我的問題修改)

if (!_tc.Connected) 
      { 
       try 
       { 


        connect2(deviceIPAddress, devicePort); 

       } 
       catch 
       { 
        if (deviceDownNotified == false) 
        { 

         ((ListBox)mainUI.Controls["lbLog"]).InvokeEx(f => ((ListBox)mainUI.Controls["lbLog"]).Items.Add("device " + device.deviceDescription + " down at " + System.DateTime.Now)); 
         (mainUI.Controls["btn" + device.deviceButtonNumber]).BackgroundImage = null; 
         (mainUI.Controls["btn" + device.deviceButtonNumber]).BackColor = Color.Blue; 
         deviceDownNotified = true; 
         try 
         { 

          _tc = new TcpClient(); 

          initialPoll = false; 


          MessageBox.Show("here"); 
         } 
         catch (Exception error) 
         { 
          MessageBox.Show(error.Message); 
         } 
        } 
       } 

      } 

在這裏,我簡單地創建了一個新的TcpListener使用相同的名稱(我原來是一個類的實例的變量(什麼是繞口令)創建這個新的TCP實例,然後設置我的inialPoll變量允許所有事情都回到軌道上。