¿Cómo puedo obtener la dirección IPv4 de una interfaz en Linux desde el código C?Obtener la dirección IP de una interfaz en Linux
Por ejemplo, me gustaría obtener la dirección IP (si corresponde) asignada a eth0.
¿Cómo puedo obtener la dirección IPv4 de una interfaz en Linux desde el código C?Obtener la dirección IP de una interfaz en Linux
Por ejemplo, me gustaría obtener la dirección IP (si corresponde) asignada a eth0.
Prueba esto:
#include <stdio.h>
#include <unistd.h>
#include <string.h> /* for strncpy */
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <netinet/in.h>
#include <net/if.h>
#include <arpa/inet.h>
int
main()
{
int fd;
struct ifreq ifr;
fd = socket(AF_INET, SOCK_DGRAM, 0);
/* I want to get an IPv4 IP address */
ifr.ifr_addr.sa_family = AF_INET;
/* I want IP address attached to "eth0" */
strncpy(ifr.ifr_name, "eth0", IFNAMSIZ-1);
ioctl(fd, SIOCGIFADDR, &ifr);
close(fd);
/* display result */
printf("%s\n", inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr));
return 0;
}
El ejemplo de código se toma de here.
Además del método ioctl() Filip demostró que puede usar getifaddrs(). Hay un programa de ejemplo en la parte inferior de la página de manual.
getifaddrs parece muy completo. Otros métodos solo darán la dirección principal o primera por interfaz. – MarkR
¡Oh, increíble, nunca lo supe! –
No tengo ninguna conexión en eth0, si utilizo el otro método, muestra 128.226.115.183 que es incorrecto. Sin embargo, este método muestra que no hay conexión en eth0 que proporcione una salida confiable – Angs
Si usted está buscando una dirección (IPv4) de la interfaz específica dicen wlan0 continuación tratar este código que utiliza getifaddrs():
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netdb.h>
#include <ifaddrs.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
int main(int argc, char *argv[])
{
struct ifaddrs *ifaddr, *ifa;
int family, s;
char host[NI_MAXHOST];
if (getifaddrs(&ifaddr) == -1)
{
perror("getifaddrs");
exit(EXIT_FAILURE);
}
for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next)
{
if (ifa->ifa_addr == NULL)
continue;
s=getnameinfo(ifa->ifa_addr,sizeof(struct sockaddr_in),host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST);
if((strcmp(ifa->ifa_name,"wlan0")==0)&&(ifa->ifa_addr->sa_family==AF_INET))
{
if (s != 0)
{
printf("getnameinfo() failed: %s\n", gai_strerror(s));
exit(EXIT_FAILURE);
}
printf("\tInterface : <%s>\n",ifa->ifa_name);
printf("\t Address : <%s>\n", host);
}
}
freeifaddrs(ifaddr);
exit(EXIT_SUCCESS);
}
Puede reemplazar wlan0 con eth0 para ethernet y lo para loopback local.
La estructura y las explicaciones detalladas de las estructuras de datos utilizadas se pueden encontrar en here.
Para saber más sobre la lista de enlaces en C, este page será un buen punto de partida.
Mis 2 centavos: el mismo código funciona incluso si el IOS:
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netdb.h>
#include <ifaddrs.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#import "ViewController.h"
@interface ViewController()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
showIP();
}
void showIP()
{
struct ifaddrs *ifaddr, *ifa;
int family, s;
char host[NI_MAXHOST];
if (getifaddrs(&ifaddr) == -1)
{
perror("getifaddrs");
exit(EXIT_FAILURE);
}
for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next)
{
if (ifa->ifa_addr == NULL)
continue;
s=getnameinfo(ifa->ifa_addr,sizeof(struct sockaddr_in),host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST);
if(/*(strcmp(ifa->ifa_name,"wlan0")==0)&&(*/ ifa->ifa_addr->sa_family==AF_INET) //)
{
if (s != 0)
{
printf("getnameinfo() failed: %s\n", gai_strerror(s));
exit(EXIT_FAILURE);
}
printf("\tInterface : <%s>\n",ifa->ifa_name);
printf("\t Address : <%s>\n", host);
}
}
freeifaddrs(ifaddr);
}
@end
simplemente quitan la prueba contra wlan0 para ver los datos. ps Puede eliminar "familia"
¿por qué hay una falla de segmentación? – user138126
Da error de segmentación –
'#include' falta para 'close()' –
Angs