Depende ligeramente de exactamente lo que está tratando de probar.
El uso de bind()
en la forma sugerida por joelc le dirá si el puerto está abierto en cualquier interfaz en su máquina. Aunque debe ser minucioso, no solo debe verificar el valor de retorno desde bind()
, sino también marcar errno == EADDRINUSE
.
es decir. (modificación del código de joelc)
if(bind(socket, (struct sockaddr *)&sin,sizeof(struct sockaddr_in)) == -1)
{
if(errno == EADDRINUSE)
{
// handle port already open case
}
else
{
// handle other errors
}
}
Cambiando la dirección utilizada en la línea: ej.
sin.sin_addr.s_addr = inet_addr("192.168.1.1");
... puede probar si un puerto está disponible en una interfaz específica.
Tenga en cuenta que esta no es una prueba perfecta para el estado del puerto. Si otro proceso tenía el puerto abierto y se terminó antes de cerrar con gracia el puerto (es decir, antes de llamar al close()
en el socket), entonces generalmente obtendrá el mismo error EADDRINUSE
. (dependiendo de si la opción SO_REUSEADDR se había fijado en el zócalo)
(nota al margen: a menos que su aplicación de prueba se está ejecutando con privilegios suficientes usted no será capaz de unirse() a cualquiera de los puertos por debajo de 1024)
Como lo sugirió Anonymous, también puede consultar netstat
. Esto le dará toda la información que puede obtener al llamar repetidamente bind()
mucho más rápido y sin ninguno de los efectos secundarios (como que no tiene que vincularse realmente a los puertos, lo que los haría inutilizables para cualquier otro proceso).) Simplemente llamando al netstat -a --numeric-ports -t
y analizando la salida debería darle todo lo que está buscando.
Sin embargo, un comentario sobre la sugerencia de moogs: llamar a telnet en cada puerto solo le indicará si un socket está escuchando en ese puerto, no si realmente está abierto.
¿Es esta tarea? –