hola veran hice un programa que te pide la web y un puerto y te saca por pantalla la ip(v4) del servidor donde este alojada la pagina sin embargo cuando lo inicio me pide la web y el puerto hasta ahi todo bien pero despues me sale el siguiente error "core dump" el compilador ni me da problemas ni alertas ademas trabajo en ubuntu ayudenme plz
#include <sys/socket.h>
#include <unistd.h>
#include <fcntl.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
int stat = fcntl(sockfd, F_GETFL, 0);
char web[20];
int puertosd;
printf("Escriba el nombre de la web (www.nombre.extension)\n");
fgets(web, 20, stdin );
printf("Escriba el puero\n");
scanf("%d",&puertosd);
fcntl(sockfd, F_SETFL, stat | O_NONBLOCK);
struct hostent *host = gethostbyname(web);
struct sockaddr_in sock;
sock.sin_family = AF_INET;
sock.sin_port = htons(puertosd);
sock.sin_addr.s_addr = inet_addr(host->h_addr);
connect(sockfd, (struct sockaddr*) &sock, sizeof(sock));
printf("Nombre: %s\n", host->h_name);
printf("Direccion IP(v4) del servidor: %s\n", inet_ntoa(*((struct in_addr *)host->h_addr)));
close(sockfd);
return 0;
}
¡Buenas ankora45!
El problema lo tienes en esta linea:
sock.sin_addr.s_addr = inet_addr(host->h_addr);
Mira este enlace que hablan sobre tu problema
http://foro.elhacker.net/programacion_cc/asignar_ip_a_una_sockaddrin-t217251.0.html (http://foro.elhacker.net/programacion_cc/asignar_ip_a_una_sockaddrin-t217251.0.html)
Un saludo.
Gracias por la ayuda pero sigo sin entenderlo ya que corrijo la linea pero me sigue saltando incluso no me deja compilar
Bueno creo que ya he dado con el problema...
En realidad esta en la funcion htons(). La funcion htons(u_16) recibe un numero de 16 bits, pero tu le estas pasando un int puertosd que es de 32 bits, por eso te da fallo de segmentacion. Para solucionarlo debes declararte el puertosd como unsigned short puertosd. Y luego ten cuidado con el scanf(puertosd) porque ya no puedes usar %d para leer creo que debes hacerlo asi scanf("%hd", &puertosd);
Un saludo.
Me sigue saltando el error segment faul (core dumped)
#include <sys/socket.h>
#include <unistd.h>
#include <fcntl.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
int stat = fcntl(sockfd, F_GETFL, 0);
char web[20];
unsigned short int puertosd;
printf("Escriba el nombre de la web (www.nombre.extension)\n");
fgets(web, 20, stdin );
printf("Escriba el puerto\n");
scanf("%hd",&puertosd);
fcntl(sockfd, F_SETFL, stat | O_NONBLOCK);
struct hostent *host = gethostbyname(web);
struct sockaddr_in sock;
sock.sin_family = AF_INET;
sock.sin_port = htons(puertosd);
sock.sin_addr.s_addr = inet_addr(host->h_addr);
connect(sockfd, (struct sockaddr*) &sock, sizeof(sock));
printf("Nombre: %s\n", host->h_name);
printf("Direccion IP(v4) del servidor: %s\n", inet_ntoa(*((struct in_addr *)host->h_addr)));
close(sockfd);
return 0;
}