Obtener la ip de un host

Iniciado por patilanz, 5 Septiembre 2014, 17:53 PM

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

patilanz

Hola conseguir hacer lo con este codigo:

Código (cpp) [Seleccionar]
memset(&configs,0,sizeof(configs));
configs.ai_protocol = IPPROTO_TCP;
configs.ai_socktype = SOCK_STREAM;
configs.ai_family = AF_INET;
configs.ai_flags = AI_PASSIVE;

iResult = getaddrinfo("www.pruebasdephp.hol.es","80",&configs,&result);
if(iResult != 0){
string msg = "Can't resolve google";
msg += itoa(iResult);
MessageBox(NULL,msg.c_str(),"Error",MB_ICONERROR);

}else
MessageBox(NULL,inet_ntoa((in_addr &)(result->ai_addr)),"Address",MB_ICONEXCLAMATION);


Usando getaddrinfo() pero aqui se necesita dar el protocolo, flags ...

Código (cpp) [Seleccionar]

params param;
hostent * host;
strcpy_s(param.web,80,"http://www.pruebasdephp.hol.es");
param.port = 80;
//now get the ip
cout << param.web;
host = gethostbyname(param.web);

in_addr addr;
memcpy_s(&addr,sizeof(in_addr),host->h_addr_list[0],host->h_length); // Infraccion de acceso


Aqui al utilizar gethostbyname() me tira un error de infraccion de acceso al copiar la memoria. Poruqe pasa esto?

Saludos

Eternal Idol

No intente ponerlos en un programa y compilar ... pero a getaddrinfo no le pasas http y a gethostbyname si, ademas deberias SIEMPRE comprobar el valor de retorno, gethostbyname puede devolver NULL en caso de error.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

patilanz

Pues si efectivamente era esto. El http pero porque?
Retornaba NULL pero como lo hice rapido para probar una cosa deje sin escribir un if pensando que funciona bien y que el error esta en memcpy. 1 hora por no poner un if.


Vale gracias resuelto pero porque es tan importante el http?

Eternal Idol

#3
No es importante, sobra, no es parte del host; es un protocolo, podrias poner ftp:// tambien, no tiene sentido cuando se esta resolviendo un host.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

patilanz

Gracias aqui pongo el codigo que funciona:

Código (cpp) [Seleccionar]
int _tmain(int argc, _TCHAR* argv[])
{ struct params{
char web[80];
int port;
in_addr ip;
};

WSADATA wsadata;
WSAStartup(MAKEWORD(2,2),&wsadata);

params param;
hostent * host;
strcpy_s(param.web,80,"www.pruebasdephp.hol.es");
param.port = 80;
//now get the ip
cout << param.web;
host = gethostbyname(param.web);
if(host == NULL)
cout << "error: " << host;

param.ip = *(struct in_addr *)host->h_addr;
cout << inet_ntoa(param.ip);
getchar();
return 0;
}

Eternal Idol

Ese codigo sigue siendo incorrecto, mostras en pantalla que fallo gethostbyname pero la ejecucion del programa continua, no podes desreferenciar host si es NULL (cosa que haces en la linea 21).
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

patilanz

Bueno ya solo era una prueba  ;D imprimo el error un getchar y return. Asi mejor ? O se puede anadir algo mas? Un log de errores ?