¿Cómo puedo saber si un puerto TCP está abierto o no?

¿Cómo puedo saber si un puerto TCP está abierto o no?

Estoy intentando implementar la programación de sockets en C. Cuando intento conectarme desde un cliente a un servidor (Ubuntu), muestra un error como "error de conexión".

Entonces creo que el problema está en el puerto. Estoy usando el puerto 5454/tcp para la programación de sockets.

¿Cómo puedo saber si el puerto 5454 está escuchando o no? Si no es así, ¿cuáles son los puertos que puedo usar para la programación de sockets TCP usando C en Ubuntu? ¿Es ese el problema solo con el puerto o hay algún problema en mi código o se requiere alguna configuración en LINUX Ubuntu?

EDITAR: Fragmento de código:

  int socket_send;
   struct sockaddr_in address;
printf("\n Initialization Socket....");

socket_send = socket(AF_INET,SOCK_STREAM,0);
if(socket_send == -1)
{
    perror("\n Socket not created.Error:");
    return 1;
}
printf("\n Socket created");

address.sin_family=AF_INET;
address.sin_addr.s_addr=inet_addr(ip);
address.sin_port=htons(5454);

if(connect(socket_send,(struct sockaddr*)&address,sizeof(struct sockaddr))<0)
{
    perror("\nConnetion failed.Error:");
    return 1;
}
printf("\n Connected");

if(send(socket_send,(char*)buffer,size,flag)<0)
{
    perror("\nSending failed.Error:");
    return 1;
}
printf("\n Data successfully sent");
 close(socket_send);

EDITAR: El problema está en el puerto, así que reinstalé Ubuntu y está funcionando. Gracias a todos ustedes.

Respuesta1

Como estás programando en CI, pensé en publicar un pequeño fragmento que muestra si el puerto está abierto o no, lo he programado para generar una cadena. Puede cambiarlo fácilmente para adaptarlo a sus necesidades.

Responda a su segunda pregunta, como todos dijeron aquí, puede usar prácticamente cualquier puerto si es el superusuario (root) en el sistema si ninguna otra aplicación usa el puerto. Si no es el root, puede abrir cualquier puerto superior a 1024.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h> 


int main(int argc, char *argv[])
{
    int portno     = 5454;
    char *hostname = "192.168.56.101";

    int sockfd;
    struct sockaddr_in serv_addr;
    struct hostent *server;

    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0) {
        error("ERROR opening socket");
    }

    server = gethostbyname(hostname);

    if (server == NULL) {
        fprintf(stderr,"ERROR, no such host\n");
        exit(0);
    }

    bzero((char *) &serv_addr, sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    bcopy((char *)server->h_addr, 
         (char *)&serv_addr.sin_addr.s_addr,
         server->h_length);

    serv_addr.sin_port = htons(portno);
    if (connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0) {
        printf("Port is closed");
    } else {
        printf("Port is active");
    }

    close(sockfd);
    return 0;
}

Respuesta2

Hay varias formas, probablemente la más común sea:

# netstat -ltun

Por supuesto, puede hacerlo grepcon otras expresiones (regulares).

iptablesSi está utilizando diferentes máquinas (cliente y servidor), también debe verificarlo .

Puedes utilizar prácticamente cualquier puerto que no esté siendo utilizado actualmente para tus programas. Sin embargo, verifique /etc/serviceslos puertos conocidos y reservados.

Respuesta3

Consulte el enlace (http://wi-fizzle.com/article/458) para el puerto TCP está abierto o no

nc -z <host_or_ip> <port> 1>/dev/null 2>&1; result=$?;

if [ $result -eq 0 ]; then
    echo 'the port is open for tcp connections'
else
    echo 'the port was closed'
fi

Respuesta4

La mejor herramienta para intentar determinar si un proceso está vinculado a un puerto TCP es netstat. Puede ejecutarlo así para obtener una lista del nombre del proceso vinculado, si lo hay, así como también las conexiones al puerto, así como su estado.

Ejemplo

$ netstat -tapn | head -15
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   
tcp        0      0 0.0.0.0:49006               0.0.0.0:*                   LISTEN      -                   
tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN      -                   
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      -                   
tcp        0      0 127.0.0.1:631               0.0.0.0:*                   LISTEN      -                   
tcp        0      0 0.0.0.0:17500               0.0.0.0:*                   LISTEN      3516/dropbox        
tcp        0      0 0.0.0.0:17501               0.0.0.0:*                   LISTEN      3517/dropbox        
tcp        0      0 0.0.0.0:2143                0.0.0.0:*                   LISTEN      4383/ssh            
tcp        0      0 127.0.0.1:1986              0.0.0.0:*                   LISTEN      2757/mono           
tcp        0      0 0.0.0.0:2025                0.0.0.0:*                   LISTEN      4383/ssh            
tcp        0      0 192.168.1.20:58285          198.252.206.25:80           TIME_WAIT   -                   
tcp        0      0 192.168.1.20:58188          198.252.206.25:80           ESTABLISHED 3830/chrome --purge 
tcp        0      0 192.168.1.20:58286          198.252.206.25:80           TIME_WAIT   -                   
tcp        0      0 192.168.1.20:54000          174.37.23.130:6667          ESTABLISHED 2696/pidgin         

Lo anterior muestra los puertos abiertos localmente en la tercera columna y los puertos remotos a los que estamos dispuestos a aceptar conexiones, como con estas 2 líneas:

tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      -                   
tcp        0      0 127.0.0.1:631               0.0.0.0:*                   LISTEN      -                   

Estas 2 líneas muestran que estamos escuchando en el puerto 22 (sshd) y estamos dispuestos a aceptar conexiones desde cualquier interfaz que tengamos (es decir, cualquier tarjeta de red, ethernet o inalámbrica). Actualmente no hay conexiones a este puerto.

La segunda línea muestra que estamos ejecutando el servidor CUPS (para imprimir) en el puerto 631 y solo podemos conectarnos a él a través de la interfaz localhost (127.0.0.1).

Más abajo tenemos estas 2 líneas:

tcp        0      0 192.168.1.20:58285          198.252.206.25:80           TIME_WAIT   -                   
tcp        0      0 192.168.1.20:58188          198.252.206.25:80           ESTABLISHED 3830/chrome --purge 

Lo que muestra que estamos accediendo a un sitio web en la dirección IP 198.252.206.25. Sabemos que es un sitio web porque accedemos a este servidor a través del puerto 80 (HTTP). Además si buscamos la dirección IP encontramos esto:

$ dig -x 198.252.206.25 +short
stackoverflow.com.

información relacionada