我正在连接到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 :(得分:1)
如果这是循环或其他内容,请注意,如果您的代码未触发任何异常,则不会关闭连接。仅在存在异常时才会关闭,该异常将由结束catch
块
答案 1 :(得分:0)
您未使用使用关键字或 finally 块来确保资源已关闭。
如果代码中有任何例外,则可能不会进行清理。您的多个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.
}