Saltar al contenido

En C#, ¿cómo verificar si un puerto TCP está disponible?

Por fin luego de tanto luchar hemos dado con la solución de esta impedimento que ciertos los lectores de este espacio tienen. Si deseas aportar algo no dejes de compartir tu información.

Solución:

Ya que estás usando un TcpClient, eso significa que está comprobando los puertos TCP abiertos. Hay muchos buenos objetos disponibles en el espacio de nombres System.Net.NetworkInformation.

Utilizar el IPGlobalProperties objeto de llegar a un array de TcpConnectionInformation objetos, que luego puede interrogar sobre la IP y el puerto del punto final.


 int port = 456; //<--- This is your value
 bool isAvailable = true;

 // Evaluate current system tcp connections. This is the same information provided
 // by the netstat command line application, just in .Net strongly-typed object
 // form.  We will look through the list, and if our port we would like to use
 // in our TcpClient is occupied, we will set isAvailable to false.
 IPGlobalProperties ipGlobalProperties = IPGlobalProperties.GetIPGlobalProperties();
 TcpConnectionInformation[] tcpConnInfoArray = ipGlobalProperties.GetActiveTcpConnections();

 foreach (TcpConnectionInformation tcpi in tcpConnInfoArray)
 
   if (tcpi.LocalEndPoint.Port==port)
   
     isAvailable = false;
     break;
   
 

 // At this point, if isAvailable is true, we can proceed accordingly.

Estás en el lado equivocado del Intertube. Es el servidor que solo puede tener abierto un puerto en particular. Algo de código:

  IPAddress ipAddress = Dns.GetHostEntry("localhost").AddressList[0];
  try 
    TcpListener tcpListener = new TcpListener(ipAddress, 666);
    tcpListener.Start();
  
  catch (SocketException ex) 
    MessageBox.Show(ex.Message, "kaboom");
  

falla con:

Normalmente solo se permite un uso de cada dirección de socket (protocolo/dirección de red/puerto).

Cuando configura una conexión TCP, la tupla de 4 (ip de origen, puerto de origen, IP de destino, puerto de destino) debe ser única; esto es para garantizar que los paquetes se entreguen en el lugar correcto.

Hay una restricción adicional en el servidor lado que solo un programa de servidor puede vincularse a un número de puerto entrante (suponiendo una dirección IP; los servidores de múltiples NIC tienen otros poderes pero no necesitamos discutirlos aquí).

Entonces, al final del servidor, tú:

  • crear un zócalo.
  • vincular ese socket a un puerto.
  • escuchar en ese puerto.
  • aceptar conexiones en ese puerto. y puede haber múltiples conexiones entrantes (una por cliente).

En el lado del cliente, por lo general es un poco más simple:

  • crear un zócalo.
  • abrir la conexión. Cuando un cliente abre la conexión, especifica la dirección IP y el puerto del servidor. Eso pueden especifica su puerto de origen, pero generalmente usa cero, lo que hace que el sistema le asigne un puerto libre automáticamente.

Hay no requisito de que la IP/puerto de destino sea único, ya que eso daría como resultado que solo una persona a la vez pudiera usar Google, y eso destruiría bastante bien su modelo comercial.

Esto significa que incluso puede hacer cosas tan maravillosas como FTP multisesión, ya que configura varias sesiones donde la única diferencia es su puerto de origen, lo que le permite descargar fragmentos en paralelo. Los torrents son un poco diferentes en el sentido de que el destino de cada sesión suele ser diferente.

Y, después de toda esa palabrería (lo siento), la respuesta a su pregunta específica es que no necesita especificar un puerto libre. Si se está conectando a un servidor con una llamada que no especifica su puerto de origen, es casi seguro que usará cero debajo de las cubiertas y el sistema le dará uno sin usar.

Puntuaciones y reseñas

Si te gustó nuestro trabajo, eres capaz de dejar una noticia acerca de qué le añadirías a esta crónica.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *