como sacar la ip de la maquina con C ??

yao04

Bovino maduro
#1
hola compañeros programadores..........

esta es la cosa:

estoy trabajando en ubuntu. tengo q crear una comunicacion entre maquinas usando sockets y otras cosas, lo q ahora necesito es sacar mi IP pero mi aplicacion lo debe hacer d forma automatica d tal forma q si lo corro en otra maquina ps automaticamente va a jalar la dir IP.

entonces esa es la pregunta. a traves de un codigo en C sacar la ip. en realidad no les pido q me hagan la tarea, ya me canse d buscar pero no encuentro concretamente lo q kiero, asi q si alguien me puede ayudar, por favor.

estoy estudiando, pero soy programador solo en java, aun no le entro al C. entonces aunq encuentre algo en internet no sabria decir si es lo q busco. y a este profe le vale madre eso, el lo kiere en C y si no no.

d antemano muchas gracias
 
#2
mmm si no sabes programar mucho en C la verdad se te va a complicar un poco yo igual estoy trabajando en un proyecto parecido utilizando sockets para obtener la IP de la maquina necesitas usar un ioctl en especifico SIOCIFADDR este te devolvera la direccion ip y la guardara en una estructua tipo ifreq te recomiendo que le des una leida a los manuales de linux en especial a estos 4: socket netdevice ioctl e ioctl_list para acceder a ellos solo escribe en tu terminal: man socket, man netdevice, man ioctl y man ioctl_list espero te sirva de algo un saludo
 

yao04

Bovino maduro
#4
no sabia q ubuntu tenia eso.... igual y lo estudio y le pido ayuda a algun compañero d la clase....

lo de leer la salida d la consola se puede hacer????
 

mdx4

Bovino maduro
#5
Hola, espero no sea muy tarde, te paso este código q es el q uso en todos mis programas de redes, ojalá te sea de utilidad, está comentadito y utiliza los IOCTL de linux. Te saca la MAC, la IP y Máscara de Subred:

Código:
#include <sys/socket.h>
#include <netpacket/packet.h>
#include <net/ethernet.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define INDICE 3  //es el índice de la interfaz, en mi caso 3 es la wireless
/*
 * Variables Globales de los datos
 * Todas son de tipo unsigned char por que se manejan como bytes
 */
unsigned char miMAC[6]={0x00};  //MAC del equipo
unsigned char miIP[4]={0x00};   //IP del equipo
unsigned char mask[4]={0x00};   //Máscara de subred
unsigned char gateway[4]={0x00};//Puerta de enlace
unsigned char dns[4]={0x00};    //DNS


void obtendatos(int index, int socket); //Función que obtiene los datos de la NIC

int main(){
  int packet_socket = socket(AF_PACKET,SOCK_RAW, htons(ETH_P_ALL)); //Se abre el socket
  if(packet_socket==-1){ //Se comprueba el error
    perror("\nError al abrir el socket\n");
    return 1;
  }
  obtendatos(INDICE,packet_socket); //se obtienen los datos
  close(packet_socket); //Se cierra el socket
  return 0;
}

void obtendatos(int index, int socket){
  int i;
  struct ifreq interfaz; //Estructura de datos donde se almacenará la información
  interfaz.ifr_ifindex=index; //Se indica cuál es el índice de la interfaz a utilizar
  if(ioctl(socket,SIOCGIFNAME,&interfaz)==-1){ //Obtiene el nombre de la interfaz
    perror("Error al obtener nombre de la interfaz");
    return;
  }
  printf("Interfaz: %s\n",interfaz.ifr_name);
  if(ioctl(socket,SIOCGIFHWADDR,&interfaz)==-1){ //Obtiene la MAC del equipo
    perror("Error al obtener MAC");
    return;
  }
  memcpy(miMAC,interfaz.ifr_hwaddr.sa_data,6); //Copia la MAC a miMAC
  printf("MAC: ");
  for(i=0;i<6;i++){  //Imprime bonito la MAC
    printf("%.2x",miMAC[i]);
    if(i!=5)
      printf(":");
  }
  if(ioctl(socket,SIOCGIFADDR,&interfaz)==-1){ //Obtiene la IP
    perror("Error al obtener IP");
    return;
  }
  printf("\nIP: ");
  memcpy(miIP,interfaz.ifr_addr.sa_data+2,4); //Copia la IP a miIP
  for(i=0;i<4;i++){ //Imprime bonito la IP
    printf("%d",miIP[i]);
    if(i!=3)
      printf(".");
  }
  if(ioctl(socket,SIOCGIFNETMASK,&interfaz)==-1){ //Obtiene la máscara de subred
    perror("Error al obtener Mascara de Subred");
    return;
  }
  printf("\nMascara de subred: ");
  memcpy(mask,interfaz.ifr_netmask.sa_data+2,4); //copia la máscara a mask
  for(i=0;i<4;i++){  //Imprime bonito la máscara de subred
    printf("%d",mask[i]);
    if(i!=3)
      printf(".");
  }
  printf("\n");
  return;
}
 
Arriba