Foros - Stratos

Programadores => Programación en red => Mensaje iniciado por: _Grey en 04 de Septiembre de 2003, 09:32:38 PM

Título: Sacar La Ip Propia
Publicado por: _Grey en 04 de Septiembre de 2003, 09:32:38 PM
 Estoi trasteando un poco con la programacion WinSock, y miraba de conseguir la ip propia, despues de mucho bucear por variada documentacion e encontrado que la mejor forma es usar gethostname(), para sacar el nombre del host, y despues gethostbyname() para sacar la ip.

El problema es que me salen 3 ip's distintas en hostent->h_addr_list, mirandolos se puede ver que la ip es la tercera, pero, por el programa, como puedo saber que ip es la que tiene la maquina en internet?? siempre es la ultima!?

Gracias.
Título: Sacar La Ip Propia
Publicado por: ethernet en 05 de Septiembre de 2003, 07:51:47 AM
 No es una ip por maquina, es una ip por interface, tranquilamente un pc puede tener 10 ip's "de internet". Quizas estas  direcciones te puedan ayudar:

http://tangentsoft.net/wskfaq/intermediate....html#getipaddr
http://tangentsoft.net/wskfaq/examples/ipaddr.html

y http://tangentsoft.net/wskfaq/examples/getifaces.html donde viene un codigo fuente.

Por otra parte en ifconfig (linux) e ipconfig (windows) puedes saber a  interface pertenece cada ip.  
Yo siempre que he pillado la ip propia lo he hecho a partir de un socket conectado a otro host por internet

saludos


PD: Para que esta el foro de programacion en red? :)
Título: Sacar La Ip Propia
Publicado por: Zaelsius en 05 de Septiembre de 2003, 10:50:44 AM
 Por cierto, para los que no lo sepan, la IP local(cuando no se está en ninguna red, y quereis hacer pruebas de sockets localmente), es 127.0.0.1  :)  
Título: Sacar La Ip Propia
Publicado por: ethernet en 05 de Septiembre de 2003, 11:01:29 AM
 Casi seguro q uno de los interfaces q le sale a _grey es ese, que se denomina looback


B) oh si nena ! xdd
Título: Sacar La Ip Propia
Publicado por: Mars Attacks en 05 de Septiembre de 2003, 11:24:49 AM
 loopback  :P  
Título: Sacar La Ip Propia
Publicado por: ethernet en 05 de Septiembre de 2003, 11:57:36 AM
 si, loopback, se me fue el teclado, pero siempre esta mars (corrector ortografico) para solucionar problemas xdd
Título: Sacar La Ip Propia
Publicado por: Mars Attacks en 05 de Septiembre de 2003, 01:35:50 PM
 A su servicio  :)

(Claro, claro, se me fue el teclado...  <_< )
Título: Sacar La Ip Propia
Publicado por: ethernet en 05 de Septiembre de 2003, 02:22:22 PM
 hexdump lo sufre en sus carnes a diario xdd
Título: Sacar La Ip Propia
Publicado por: _Grey en 06 de Septiembre de 2003, 08:01:52 PM
 Se que parecere un poco puñetero.... pero precisamente ya habia mirado la pagina que pone ethernet, el problema que tengo es saber cual es (o cuales son) la ip de la maquina en internet, y parece que no se puede sacar asi com asi.

Ethernet, como dices que sacas la ip de un socket ya conectado. :ph34r:

Gracias.

Título: Sacar La Ip Propia
Publicado por: Zaelsius en 06 de Septiembre de 2003, 09:00:13 PM
 Supongo que se referirá a conectarse a un host que esté en internet(no en lan, ni intranet, ni ná), y mirar la ip propia correspondiente a esa conexión. ¿no?
Título: Sacar La Ip Propia
Publicado por: _Grey en 06 de Septiembre de 2003, 09:06:47 PM
 Si .... claro.... pero ni en la documentacion de VC++, ni en libros como "internet interno" encuentro como.

Ya puestos... como la cojo? la ip de un socket ya conectado?

PD Me tengo que explicar muyyyy mal. :ph34r:  
Título: Sacar La Ip Propia
Publicado por: Storm en 06 de Septiembre de 2003, 10:42:14 PM
 Sacado de internet. Es para Borland C++ Builder pero creo k con unas conversiones te sevira. AnsiString por std::string etc etc

#include <winsock2.h>

// ...

void __fastcall TForm1::Button1Click(TObject *Sender)
{
     WORD wVersionRequested;
     WSADATA wsaData;
     char name[255];
     AnsiString ip;
     PHOSTENT hostinfo;
     wVersionRequested = MAKEWORD( 2, 0 );

     if ( WSAStartup( wVersionRequested, &wsaData ) == 0 )
     {

           if( gethostname ( name, sizeof(name)) == 0)
           {
               Label1->Caption = name;
                 if((hostinfo = gethostbyname(name)) != NULL)
                 {
                       ip = inet_ntoa (*(in_addr *)*hostinfo->h_addr_list);
                       Label2->Caption = ip;
                 }
           }
           WSACleanup( );
     }
}
Título: Sacar La Ip Propia
Publicado por: ethernet en 06 de Septiembre de 2003, 11:43:37 PM
 
Citar
3.3 - How do I get my IP address from within a Winsock program?

There are three methods, which each have advantages and disadvantages:

   1. The simplest method is to call getsockname() on a connected socket. If you don't have a connected socket, this method will either fail or will return useless or redundant information.

teniendo suerte en google -> http://mkssoftware.com/docs/man3/getsockname.3.asp
y buscando un poquico mas -> http://sources.redhat.com/ml/cygwin/1998-0...5/msg00184.html

capichi? XD
Título: Sacar La Ip Propia
Publicado por: Milinko en 08 de Septiembre de 2003, 11:15:39 AM
Este codigo te puede servir para sacar los interfaces de Red de un sistema Win32.




#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>


int main()
{
WSADATA wsaData;
WORD  version;
int   ret;
int   idsocket;
DWORD  bytesReturned;

INTERFACE_INFO localAddr[10];

// Inicializamos Winsock
version = MAKEWORD(2,0);

ret = WSAStartup(version, &wsaData);
if (ret != 0)
 return -1;

// Comprobamos que la versión es correcta
if (LOBYTE(wsaData.wVersion) != 2 ||
  HIBYTE(wsaData.wVersion) != 0)
{
 WSACleanup();
 return -1;
}

// Creamos un socket
idsocket = WSASocket(AF_INET, SOCK_DGRAM, IPPROTO_UDP, NULL, 0, 0);
if (idsocket == INVALID_SOCKET)
{
 fprintf(stderr, "Error al crear socket...\n");
 return -1;
}


// Enumeramos los interfaces de red locales
printf("Buscando Interfaces...\n\n");

ret = WSAIoctl(idsocket, SIO_GET_INTERFACE_LIST, NULL, 0, &localAddr,
        sizeof(localAddr), &bytesReturned, NULL, NULL);
if (ret == SOCKET_ERROR)
{
 fprintf(stderr, "Error &d en WSAIoctl\n", GetLastError());
 closesocket(idsocket);
 WSACleanup();
 return -1;
}

// Mostramos la info
int numdirecciones = (bytesReturned / sizeof(INTERFACE_INFO));

SOCKADDR_IN* pAddrInet;
char*     pAddrDesc;
u_long    SetFlags;

for (int i=0; i < numdirecciones; i++)
{
 pAddrInet = (SOCKADDR_IN*) &localAddr[i].iiAddress;
 pAddrDesc = inet_ntoa(pAddrInet->sin_addr);
 if (pAddrDesc)
  printf("IP: %s \n", pAddrDesc);

 pAddrInet = (SOCKADDR_IN*) &localAddr[i].iiNetmask;
 pAddrDesc = inet_ntoa(pAddrInet->sin_addr);
 if (pAddrDesc)
  printf("NETMASK: %s \n", pAddrDesc);
 
 pAddrInet = (SOCKADDR_IN*) &localAddr[i].iiBroadcastAddress;
 pAddrDesc = inet_ntoa(pAddrInet->sin_addr);
 if (pAddrDesc)
  printf("BROADCAST: %s \n", pAddrDesc);

 SetFlags = localAddr[i].iiFlags;
 if (SetFlags && IFF_UP)
  printf("Este interface esta activo\n");
 if (SetFlags && IFF_BROADCAST)
  printf("Este interface soporta Broadcast\n");
 if (SetFlags && IFF_MULTICAST)
  printf("Este interface soporta Multicast\n");
 if (SetFlags && IFF_LOOPBACK)
  printf("LOOPBACK INTERFACE\n");
 if (SetFlags && IFF_POINTTOPOINT)
  printf("Interface punto-a-punto\n");
 printf("----------------------------\n\n");
}

WSACleanup();

return 0;
}


Milinko
Título: Sacar La Ip Propia
Publicado por: shephiroth en 06 de Abril de 2004, 08:07:04 PM
 Buenas. Solo comentar que el codigo anterior me da problemas de unresolved symbols......faltará incluir algo??? Lo he probado en visual c++.net y en visual c++ 6.0

SALUDOS ^_^
Título: Sacar La Ip Propia
Publicado por: BeRSeRKeR en 06 de Abril de 2004, 08:23:52 PM
Cita de: "shephiroth"Buenas. Solo comentar que el codigo anterior me da problemas de unresolved symbols......faltará incluir algo??? Lo he probado en visual c++.net y en visual c++ 6.0

SALUDOS ^_^
Tal vez te falte enlazar la librería WSock32.lib.

Saludos.
Título: Sacar La Ip Propia
Publicado por: shephiroth en 06 de Abril de 2004, 09:43:30 PM
 Buenas. Me sigue dando problemas de linkeo. LA pantalla que me sale es la siguiente:

--------------------Configuration: asd - Win32 Debug--------------------
Linking...
asd.obj : error LNK2001: unresolved external symbol __imp__WSAIoctl@36
asd.obj : error LNK2001: unresolved external symbol __imp__WSASocketA@24
LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16
Debug/asd.exe : fatal error LNK1120: 3 unresolved externals
Error executing link.exe.

asd.exe - 4 error(s), 0 warning(s)


En las propiedades del proyecto veo que tiene listadas las siguientes librerias:

WSock32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib

Alguna idea??

GRACIAS.
Título: Sacar La Ip Propia
Publicado por: Juan Mellado en 06 de Abril de 2004, 10:21:40 PM
 Hola shephiroth,

1) Crea el proyecto como "Win32 Console Application", ya que usa main(), y no WinMain(), como punto de entrada al programa.

2) Añade la librería ws2_32.lib a la lista. Normalmente puedes ver en la ayuda de una función del API los include (.h y .lib) que necesita.

Espero te sirva,
Saludos
Título: Sacar La Ip Propia
Publicado por: BeRSeRKeR en 06 de Abril de 2004, 10:23:44 PM
 En vez de WSock32 prueba con Ws2_32. El otro problema que tienes es que estás intentando compilar una aplicación de consola (función de entrada main) con un perfil de aplicación windows (WinMain). Así que tienes que cambiar el tipo de aplicación a tipo consola.

Saludos.

PD: vaya, se me ha adelantado Juan Mellado. :)
Título: Sacar La Ip Propia
Publicado por: Zaelsius en 06 de Abril de 2004, 10:46:59 PM
 Tienes que enlazar con la libreria "Ws2_32.lib"... bueno hemos respondido tres personas a esta pregunta en un margen de minutos jajajajaj.

A ver si consultamos antes la MSDN o el Platform SDK  :rolleyes:  
Título: Sacar La Ip Propia
Publicado por: shephiroth en 06 de Abril de 2004, 10:48:05 PM
 Buenas. Si, añadiendo la otra libreria ya funciona. Crear la aplicacion de consola no fue necesario, pues que al compilar directamente reconoce si se usa funcion main o winmain (es decir, se puede utilizar una u otra, pero solo utilizar una).

Lo unico que ahora me da siempre "Error &d en WSAIoctl" xDD pero weno, por lo menos ya rula...alguien me explica por que da, o forma de solucionarlo??

GRACIAS.
Título: Sacar La Ip Propia
Publicado por: Milinko en 06 de Abril de 2004, 11:45:31 PM
Error mío al escribir el código.

Sustituye la línea 47 por:

fprintf(stderr, "Error %d en WSAIoctl\n", GetLastError());

Cuando vuelvas a ejecutar te debe dar un numero de error, lo puedes consultar en el MSDN y si no lo ves claro postealo.

Un saludo,

Milinko
Título: Sacar La Ip Propia
Publicado por: shephiroth en 07 de Abril de 2004, 11:15:04 PM
 Wenas. Lo primero pedir disculpas por lo ultimo, era muy tarde, estaba cansado y no me di cuenta del & en vez del %, sino lo habría cambiado directamente. Ahora al tajo xDD

Pues el número que me da de error es el 0 xDD algo aqui algo anda mal xDD

Voy al MSDN antes ha comprobarlo, que puede que exista ese error y todo............no he encontrado nada relevante........no he encontrado ni la tabla de errores, asi que algo hay por ahi xDD.

Que raro, he colocado un System::Console::WriteLine(GetLastError().ToString()); antes de que comprobase en esa posicion, y me sigue dando error pero ahora me marca el error 126. Lo dicho, en MSDN no he encontrado la tabla de errores. Alguien me puede decir q significa??

Título: Sacar La Ip Propia
Publicado por: BeRSeRKeR en 08 de Abril de 2004, 01:52:49 AM
 ¿Seguro que sólo te dice error 126?. Normalmente te da un error tipo C1026. Y bueno, para encontrar la definición del error, lo que yo hago es en el índice de la MSDN poner el código de error. Por ejemplo el C1026.

Saludos.
Título: Sacar La Ip Propia
Publicado por: Zaelsius en 08 de Abril de 2004, 12:09:09 PM
Cita de: "shephiroth"
Que raro, he colocado un System::Console::WriteLine(GetLastError().ToString());
¿Si utilizas C++ administrado por qué no utilizas las clases socket de .NET directamente?