Thread View: es.comp.os.linux.programacion
7 messages
7 total messages
Started by Ander
Tue, 14 Sep 1999 00:00
Direccion IP en C y PPP.
Author: Ander
Date: Tue, 14 Sep 1999 00:00
Date: Tue, 14 Sep 1999 00:00
7 lines
737 bytes
737 bytes
Hola, Teniendo el PPP en marcha, como consigo en C la direccion IP asignada por el proveedor ? Gracias. ASarratea @msi.mcc.es
Re: Direccion IP en C y PPP.
Author: Luis Paúl Tomillo
Date: Tue, 14 Sep 1999 00:00
Date: Tue, 14 Sep 1999 00:00
36 lines
1633 bytes
1633 bytes
Ander <sarratea@mixmail.com> wrote:
> Hola,
> Teniendo el PPP en marcha, como consigo en C la direccion IP asignada por el
> proveedor ?
> Gracias.
> ASarratea @msi.mcc.es
Quiz�s la siguiente funci�n te ayude:
/* Obtener direccion IP de maquina. Devuelve 0 si error. */
int obtener_dir(char* maquina, struct sockaddr_in* si)
{
struct hostent* phost;
phost = gethostbyname(maquina);
if (phost == NULL) return 0;
bcopy((char *)phost->h_addr, (char *)&si->sin_addr, phost->h_length);
si->sin_family = phost->h_addrtype;
return 1;
}
En teor�a podr�as especificar el nombre de la m�quina local y obtener
a trav�s de "si" la direcci�n IP asociada.
Otra forma podr�a ser lanzando desde C el programa hostname -i y recogiendo
la salida de este programa.
--
_ |\
/ \ __ /\_ / \ _
_/ \ / \/ \__/ V \_
/ V \_
Luis Paul Tomillo luispaul@bbvnet.com
Re: Direccion IP en C y PPP.
Author: oscar
Date: Wed, 15 Sep 1999 00:00
Date: Wed, 15 Sep 1999 00:00
16 lines
1435 bytes
1435 bytes
Luis Pa�l Tomillo <luis@belcebu.ccr.es> wrote: > En teor�a podr�as especificar el nombre de la m�quina local y obtener > a trav�s de "si" la direcci�n IP asociada. > Otra forma podr�a ser lanzando desde C el programa hostname -i y recogiendo > la salida de este programa. Si nos estamos limitando a Linux, podemos ver nuestro nombre en /proc/sys/kernel/hosname Y si quieres obtener la IP directamente se puede con una serie de llamadas ioctl sobre un socket. Haz un strace del "ifconfig" y ver�s. Claro que de estandar nada. Creo que el tcpdump est� basado en unas librer�as hasta cierto punto estandar de este tipo de cosas.
Re: Direccion IP en C y PPP.
Author: J.A. Gutierrez
Date: Wed, 15 Sep 1999 00:00
Date: Wed, 15 Sep 1999 00:00
75 lines
2856 bytes
2856 bytes
oscar@server.enmicasa.dhs.org wrote:
: Luis Pa�l Tomillo <luis@belcebu.ccr.es> wrote:
:> En teor�a podr�as especificar el nombre de la m�quina local y obtener
:> a trav�s de "si" la direcci�n IP asociada.
:> Otra forma podr�a ser lanzando desde C el programa hostname -i y recogiendo
:> la salida de este programa.
: Si nos estamos limitando a Linux, podemos ver nuestro nombre en
: /proc/sys/kernel/hosname
: Y si quieres obtener la IP directamente se puede con una serie de llamadas
: ioctl sobre un socket.
: Haz un strace del "ifconfig" y ver�s.
hombre, tampoco hay que irse tan abajo:
===========================================================================
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <errno.h>
#ifndef INADDR_NONE
#define INADDR_NONE 0xffffffff
#endif
int main(int argc, char **argv)
{
char hostname[256];
struct hostent *he;
u_long add;
if (gethostname(hostname,sizeof(hostname)) < 0)
{
perror("gethostname: who am I ?");
exit(1);
}
if ( (he=gethostbyname(hostname)) == NULL)
{
perror("gethostbyname: can't get an address");
exit(1);
}
add=htonl( ((struct in_addr *)(he->h_addr_list[0]))->s_addr );
printf("%d.%d.%d.%d\n",
(add & 0xff000000)>>24,
(add & 0x00ff0000)>>16,
(add & 0x0000ff00)>>8,
(add & 0x000000ff)
);
return(0);
}
===========================================================================
por otra parte, este codigo supone que solo tienes un nombre
principal y que a ese nombre solo le corresponde una IP, cosas
ambas que no tienen por que ser ciertas.
--
PGP and other useless info at \ Oh, show us the way
http://www.cps.unizar.es/~spd/ \ to the next whisky bar
finger://daphne.cps.unizar.es/spd \ Weill/Bretch
Lo que si que es cierto es que la felicidad no da el dinero...
Re: Direccion IP en C y PPP.
Author: Gonzalo Paniagua Javier
Date: Wed, 15 Sep 1999 00:00
Date: Wed, 15 Sep 1999 00:00
80 lines
3304 bytes
3304 bytes
Ander <sarratea@mixmail.com> escribi� en es.comp.os.linux.programacion:
> Hola,
> Teniendo el PPP en marcha, como consigo en C la direccion IP asignada por el
> proveedor ?
> Gracias.
> ASarratea @msi.mcc.es
En algun fichero de log, posiblemente /var/log/messages, te lo dice
en las �ltimas l�neas. Desde el programa podr�as cogerla, pero es m�s
elegante esta otra opci�n.
Aqu� tienes c�digo para conseguir lo que quieres.
Lo que hace es:
-Prepara un socket.
-Se conecta a un host REMOTO (si lo haces en local,
posiblemente obtengas como direcci�n local la 127.0.0.1).
-Obtiene datos del socket, entre los que est� la direcci�n
local.
/***********************************************************************/
/* Los includes (m�s vale que sobren que no que falten :)
#include <netdb.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/socket.h>
/*
/** sockfd: descriptor del socket
/** lenlocal: almacena tama�o de 'localhost'
*/
int sockfd, lenlocal;
/*
/** ptr: Al final contiene una cadena con la direcci�n de nuestro host
*/
char *ptr;
/*
/** host: direcci�n del host remoto
*/
struct hostent *host;
/*
/** para almacenar direcciones en formato de red
*/
struct sockaddr_in remote, localhost;
/* Creamos el socket */
sockfd = socket (AF_INET, SOCK_STREAM, 0);
if (sockfd != -1){
/* Un host que siempre funcione y que no sea el propio */
#define HOSTNAME "ftp.rediris.es"
if ((host = gethostbyname(HOSTNAME)) != NULL){
remote.sin_family = AF_INET;
remote.sin_addr.s_addr = *(long *)host->h_addr;
/* Puerto de ftp */
#define PUERTO_SERVIDOR 21
remote.sin_port = htons(PUERTO_SERVIDOR);
/* Conectamos con el host remoto */
if (connect (sockfd, (struct sockaddr *)&remote, sizeof(remote)) == -1){
close(sockfd);
printf("Error en connect: %s\n", strerror(errno));
}
else {
lenlocal = sizeof(localhost);
/* Obtiene el 'nombre' del socket */
if (getsockname(sockfd,
(struct sockaddr *)&localhost,
&lenlocal) <0)
{
printf("Error en getsockname.\n");
}
}
}
}
/* Ahora tenemos en localhost.sin_addr la direcci�n en formato de
/* red de nuestro ordenador */
ptr = inet_ntoa(localhost.sin_addr);
printf("Dir. local: %s\n", ptr);
/**********************************************************************/
Re: Direccion IP en C y PPP.
Author: Gonzalo Paniagua Javier
Date: Wed, 15 Sep 1999 00:00
Date: Wed, 15 Sep 1999 00:00
7 lines
1149 bytes
1149 bytes
Por cierto, se me olvid� poner "close(sockfd);" para cerrar la conexi�n. El c�digo funciona aunque tengas varios interfaces de salida y te dar� la direcci�n (o una de ellas) que tenga tu ordenador para salir por ese interfaz, es decir, que si la salida es ppp0, te dar� la direcci�n que te asigna tu ISP.
Re: Direccion IP en C y PPP.
Author: leumas
Date: Fri, 17 Sep 1999 00:00
Date: Fri, 17 Sep 1999 00:00
87 lines
3506 bytes
3506 bytes
El d�a 15 Sep 1999 09:55:03 GMT, un nota de nombre oscar@server.enmicasa.dhs.org
(oscar@server.enmicasa.dhs.org), fue a decir...
>Luis Pa�l Tomillo <luis@belcebu.ccr.es> wrote:
>
>> En teor�a podr�as especificar el nombre de la m�quina local y obtener
>> a trav�s de "si" la direcci�n IP asociada.
>
>> Otra forma podr�a ser lanzando desde C el programa hostname -i y recogiendo
>> la salida de este programa.
>
>Si nos estamos limitando a Linux, podemos ver nuestro nombre en
>/proc/sys/kernel/hosname
>Y si quieres obtener la IP directamente se puede con una serie de llamadas
>ioctl sobre un socket.
yo voy a exponer esa serie de llamadas :-)
<---- interface.c ---->
/*
* Funciones para obtener informaci�n sobre los interfaces activos.
*
* Consegu� hacer esto gracias al codigo del
* ifconfig (Author: Fred N. van Kempen, <waltje@uwalt.nl.mugnet.org>
* and others. Copyright 1993 MicroWalt Corporation)
* tras 3 horas de dar vueltas por el codigo y otras cuantas por los
* includes... :-)
*
* Author de esto: leumas (1999)
*
*/
//#include <sys/types.h>
//#include <sys/socket.h>
#include <sys/ioctl.h>
#include <netinet/in.h>
#include <net/if.h>
//#include <stdio.h>
//#include <errno.h>
//#include <stdlib.h>
//#include <string.h>
//#include <unistd.h>
//#include <ctype.h>
/*
* ip_interface
*
* obtiene la ip (de cara a Internet) de un interface, siempre y cuando
* este activo; ifname debe ser algo como 'lo','ppp0',...
*
*/
unsigned long ip_interface (unsigned char *ifname)
{
int inet_sock;
struct ifreq ifr;
struct sockaddr_in *ifaddr;
short ifflags;
inet_sock = socket(AF_INET, SOCK_DGRAM, 0);
// el socket para hacerle las ioctl...
// cogemos los flags del interface
strcpy(ifr.ifr_name, ifname);
if (ioctl(inet_sock, SIOCGIFFLAGS, &ifr) < 0) return(0);
ifflags = ifr.ifr_flags;
// nos aseguramos de que el interface esta activo
if ((ifflags & IFF_UP) == 0) {
close(inet_sock);
return(0);
}
// ya que est� activo,miramos la ip del interface
strcpy(ifr.ifr_name, ifname);
/ / le damos el nombre del device ("lo","ppp0",...)
if (inet_sock < 0 || ioctl(inet_sock, SIOCGIFADDR, &ifr) < 0) {
close (inet_sock);
return (0); // me parece que el interface no existe...
} else {
close (inet_sock);
ifaddr=(struct sockaddr_in *)&ifr.ifr_addr; // cosas del type casting...
return ((unsigned long) ifaddr->sin_addr.s_addr); // devolvemos la ip
}
<---- fin de interface.c ---->
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads