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

9

Estoy tratando de implementar la programación de socket 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 es con 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 socket TCP usando C en Ubuntu? ¿Es ese el problema con el puerto solamente o hay algo mal 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 acabo de instalar Ubuntu y está funcionando. Gracias a todos ustedes.

dxr
fuente
al principio, el puerto 5454 debería escuchar el estado, luego se conecta. segundo, verifique su firewall.
PersianGulf
Siempre intento lsof -i:5454(es posible que deba ejecutarlo como el mismo usuario que lo hace el programa que abre el puerto, o como root).
Carlos Campderrós
dónde está el código del servidor (o si el servidor es un programa existente) Tenga en cuenta que si desea ejecutar un servidor ficticio, nc (netcat) es su amigo.
Foon

Respuestas:

10

Como está programando en CI, pensé en publicar un pequeño fragmento que le muestre si el puerto está abierto o no, he programado la salida de una cadena. Puede cambiarlo fácilmente para satisfacer sus necesidades.

Responda a su segunda pregunta, como todos aquí dijeron, puede usar prácticamente cualquier puerto si es el superusuario (root) en el sistema si el puerto no lo utiliza ninguna otra aplicación. Si no es la raíz, puede abrir cualquier puerto por encima de 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;
}
Purinda Gunasekara
fuente
¡Excelente! manera de verificar el estado de un puerto usando C.
Valentin Bajrami
Me encanta la mención "un pequeño fragmento" ^^. Pero +1 para un fragmento muy informativo.
Olivier Dulac
Tenga en cuenta que, en caso de que este código se ejecute simultáneamente con otros subprocesos que puedan bifurcar () nuevos procesos, es necesario asegurarse de que el descriptor del archivo de socket esté cerrado correctamente al especificar SOCK_CLOEXECla socket()llamada.
Ton van den Heuvel
5

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

# netstat -ltun

Puede, por supuesto, greppara otra expresión (regular).

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

Puede utilizar prácticamente cualquier puerto que no se esté utilizando actualmente para sus programas. Compruebe, sin embargo, los /etc/servicespuertos conocidos y reservados.

Dawud
fuente
Puede enumerar directamente los puertos tcp / udp en estado de escucha con "netstat -ltun"
dsmsk80
cuando usé netstat -an | grep LISTEN Allí solo muestra dos prots tcp y el resto son puertos UDP. Ahora, si quiero activar el puerto 5454, ¿cómo activarlo?
dxr
@ dsmsk80 ah, de hecho, supongo que los malos hábitos mueren mucho. Corregido
Dawud
1

Compruebe que 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
Saravanan
fuente
1

Usa el comando:

nmap 192.168.56.101

El resultado será la cantidad de puertos abiertos en esa máquina junto con el nombre de los servicios.

SHW
fuente
Usar cualquier cosa menos nmapesto es irse por las ramas en mi humilde opinión. Para verificar un solo puerto debe usar nmap -p5454 192.168.56.101.
jwg
Esto solo responde al título pero no responde a la pregunta real.
JZeolla
Si. Solo estaba mostrando la dirección. Tiene que caminar para obtener la respuesta deseada. :)
SHW
1

La mejor herramienta para tratar de determinar si un proceso está vinculado a un puerto TCP es netstat. Puede ejecutarlo así para obtener una lista del nombre del proceso que está vinculado, si lo hay, así como de cualquier conexión 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 

Que muestran que estamos accediendo a un sitio web en la dirección IP 198.252.206.25. Sabemos que es un sitio web porque estamos accediendo 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.
slm
fuente