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.
lsof -i:5454
(es posible que deba ejecutarlo como el mismo usuario que lo hace el programa que abre el puerto, o como root).Respuestas:
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.
fuente
SOCK_CLOEXEC
lasocket()
llamada.Hay varias formas, la más común probablemente sea:
Puede, por supuesto,
grep
para 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/services
puertos conocidos y reservados.fuente
Compruebe que el enlace ( http://wi-fizzle.com/article/458 ) para el puerto TCP está abierto o no
fuente
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.
fuente
nmap
esto es irse por las ramas en mi humilde opinión. Para verificar un solo puerto debe usarnmap -p5454 192.168.56.101
.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
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:
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:
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:
fuente