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 grep
con otras expresiones (regulares).
iptables
Si 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/services
los 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.