Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Sacar La Ip Propia

Iniciado por _Grey, 04 de Septiembre de 2003, 09:32:38 PM

« anterior - próximo »

_Grey

 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.

ethernet

 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? :)

Zaelsius

 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  :)  

ethernet

 Casi seguro q uno de los interfaces q le sale a _grey es ese, que se denomina looback


B) oh si nena ! xdd

Mars Attacks


ethernet

 si, loopback, se me fue el teclado, pero siempre esta mars (corrector ortografico) para solucionar problemas xdd

Mars Attacks

 A su servicio  :)

(Claro, claro, se me fue el teclado...  <_< )

ethernet

 hexdump lo sufre en sus carnes a diario xdd

_Grey

 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.


Zaelsius

 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?

_Grey

 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:  

Storm

 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( );
     }
}

ethernet

 
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

Milinko

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
-------------------------------------------
Milinko
"The Loneliness Of The Long Distance Runner"
--------------------------------------------

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 ^_^






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.