ayuda con sockets

Iniciado por ankora45, 12 Octubre 2012, 11:26 AM

0 Miembros y 1 Visitante están viendo este tema.

ankora45

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
Código (cpp) [Seleccionar]
#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;
}
Hay dos cosas infinitas en este mundo, el universo y la estupidez humana, y de la primera no estoy muy seguro

soyloqbuskas

¡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

Un saludo.
"Si tienes 1 manzana y yo tengo otra manzana...
y las intercambiamos, ambos seguiremos teniendo 1 manzana.
Pero...si tu tienes 1 idea y yo tengo otra idea...
y las intercambiamos, ambos tendremos 2 ideas."


George Bernard Shaw

ankora45

Gracias por la ayuda pero sigo sin entenderlo ya que corrijo la linea pero me sigue saltando incluso no me deja compilar
Hay dos cosas infinitas en este mundo, el universo y la estupidez humana, y de la primera no estoy muy seguro

soyloqbuskas

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.
"Si tienes 1 manzana y yo tengo otra manzana...
y las intercambiamos, ambos seguiremos teniendo 1 manzana.
Pero...si tu tienes 1 idea y yo tengo otra idea...
y las intercambiamos, ambos tendremos 2 ideas."


George Bernard Shaw

ankora45

Me sigue saltando el error segment faul (core dumped)
Código (cpp) [Seleccionar]
#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;
}
Hay dos cosas infinitas en este mundo, el universo y la estupidez humana, y de la primera no estoy muy seguro