c# - puerto - solo se permite un uso de cada dirección de socket php
Solo se permite normalmente un uso de cada dirección de socket(protocolo/dirección de red/puerto) (2)
No utilice la palabra clave using o finally blocks para asegurarse de que sus recursos estén cerrados.
Si hay excepciones en algún lugar de su código, la limpieza puede no ocurrir. Tus múltiples bloques catch pueden tener todos los escenarios, pero no puedo verlo fácilmente leyendo el código.
Un patrón generalmente preferido para usar los recursos que deben limpiarse es:
using (MyResource res = new MyResource())
{
// Do Stuff
}
si MyResource implementa IDisposable, o
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.
}
Me estoy conectando al puerto TCP / IP en Asp.Net, básicamente he conectado un dispositivo en este puerto al que estoy leyendo, está funcionando bien, pero en la segunda vez cuando el oyente de tcp intenta iniciar genera el error anterior. ¿Puede algún cuerpo guiarme cómo puedo deshacerme de este error? Aquí está mi código que estoy usando para conectarme al puerto 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();
}
cuando se trata de esta línea tcpListener.Start (); por segunda vez, genera el error "Normalmente solo se permite un uso de cada dirección de socket (protocolo / dirección de red / puerto)"
Si esto está en un bucle o algo así, tenga en cuenta que si su código no activa ninguna excepción, entonces la conexión no se cierra. Solo se cierra si hay una excepción, que quedaría atrapada por el bloque catch
final