2012-06-25 160 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变量允许所有事情都回到轨道上。