2010-02-10 32 views
2

我正在连接到Asp.Net中的TCP/IP端口,基本上我在这个端口上连接了一个设备,工作正常,但第二次当tcp侦听器尝试启动时,它会产生上述错误。我怎样才能摆脱 任何机构可以指导我这个错误的,这里是我的代码,我使用连接到TCP/IP端口:通常只允许使用每个套接字地址(协议/网络地址/端口)

 try 
     {     
      byte[] ipaddress = new byte[4]; 
      string ip = ConfigurationManager.AppSettings["IP"].ToString(); 
      string[] ips = ip.Split('.'); 
      ipaddress[0] = (byte)Convert.ToInt32(ips[0]); 
      ipaddress[1] = (byte)Convert.ToInt32(ips[1]); 
      ipaddress[2] = (byte)Convert.ToInt32(ips[2]); 
      ipaddress[3] = (byte)Convert.ToInt32(ips[3]); 
      int portNumber = Convert.ToInt32(ConfigurationManager.AppSettings["Port"]); 
      tcpListener = new TcpListener(new IPAddress(ipaddress), portNumber); 
      tcpListener.Start(); 
      tcpClient = new TcpClient(); 
      tcpClient.NoDelay = true; 
      try 
      { 
       System.Threading.Thread.Sleep(60000); 
       tcpClient.ReceiveTimeout = 10; 
       tcpClient = tcpListener.AcceptTcpClient(); 
      } 
      catch (Exception ex) 
      { 
       tcpClient.Close(); 
       tcpListener.Stop(); 
      } 
      NetworkStream networkStream = tcpClient.GetStream(); 
      byte[] bytes = new byte[tcpClient.ReceiveBufferSize]; 
      try 
      { 
       networkStream.ReadTimeout = 2000; 
       networkStream.Read(bytes, 0, bytes.Length); 
      } 
      catch (Exception ex) 
      { 
       tcpClient.Close(); 
       tcpListener.Stop(); 
      } 
      string returndata = Encoding.Default.GetString(bytes); 
      tcpClient.Close(); 
      tcpListener.Stop(); 

      return returndata.Substring(returndata.IndexOf("0000000036"), 170); 
     } 
     catch (Exception ex) 
     { 
      if (tcpClient != null) 
       tcpClient.Close(); 
      tcpListener.Stop(); 
      LogError("Global.cs", "ReceiveData", ex); 
      ReceiveData(); 
     } 
当谈到在这条线tcpListener.Start

();对于第二时间则生成错误 “只有每个套接字地址(协议/网络地址/端口)中的一个的使用通常被许可”

+0

乍一看,我会建议听者没有正确关闭。 – Russell 2010-02-10 23:04:50

回答

0

你不使用关键字或最后块利用的确保您的资源已关闭。

如果代码中存在任何异常,则清理可能不会发生。你的多个catch块可能得到所有场景,但是我不能通过阅读代码来轻易判断。

的使用需要清理的资源通常优选的模式是:

using (MyResource res = new MyResource()) 
{ 
    // Do Stuff 
} 

如果MyResource实现IDisposable,或

try 
{ 
    MyResource res = new MyResource(); 
    // Do Stuff 
} catch (Exception ex) 
{ 
    // Whatever needs handing on exception 
} 
finally 
{ 
    res.Close(); // Or whatever call needs to be made to clean up your resource. 
} 
+0

我面临同样的问题,我已经检查了所有使用连接的代码块,并且所有代码块都有结束连接的Finish块。 这个异常阻止了我调试我的WebApplication。有谁知道如何摆脱这个问题? – MMalke 2012-09-21 14:27:50

+0

@MMalke:你有多个线程访问连接吗?此外,您可以将连接包装在另一个实现了IDisposable的对象中,并记录资源的打开和关闭,以便您可以看到打开但未关闭的位置。 – 2012-09-23 08:05:10

1

如果这是一个循环或东西,注意如果你的代码没有触发任何异常,那么连接就没有关闭。只有在例外情况下才会关闭,这可能会在结尾处被捕获catch

相关问题