Comment puis-je obtenir l'adresse IPv4 d'une interface sous Linux à partir du code C? Par exemple, j'aimerais obtenir l'adresse IP (le cas échéant) attribuée à eth0.Obtenir l'adresse IP d'une interface sous Linux
Répondre
Essayez ceci:
#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;
}
L'exemple de code est tiré de here.
En plus de la méthode ioctl(), Filip a démontré que vous pouvez utiliser getifaddrs(). Il y a un exemple de programme en bas de la page de manuel.
getifaddrs semble très complet. Les autres méthodes ne donneront que la première ou la première adresse par interface. – MarkR
Oh génial, je ne savais jamais à ce sujet! –
Je n'ai aucune connexion sur eth0, si j'utilise l'autre méthode, elle sort 128.226.115.183 ce qui est faux. Cependant, cette méthode montre qu'il n'y a pas de connexion sur eth0 qui fournit une sortie fiable. – Angs
Si vous êtes à la recherche d'une adresse (IPv4) de l'interface spécifique dire wlan0 alors essayer ce code qui utilise 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);
}
Vous pouvez remplacer wlan0 avec eth0 pour ethernet et à pour le bouclage local. La structure et les explications détaillées des structures de données utilisées peuvent être trouvées here.
Pour en savoir plus sur la liste chaînée en C, ce page sera un bon point de départ.
Mes 2 cents: le même code fonctionne même si 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
J'ai simplement retiré le test contre wlan0 pour voir les données. ps Vous pouvez supprimer "family"
- 1. Implémentations de Mobile IP sous Linux
- 2. Faire une interface réseau virtuelle sous Linux?
- 3. bind ip au sous-domaine
- 4. Comment obtenir l'équivalent de printf_l sous Linux?
- 5. Obtenir des fichiers de TFS sous Linux
- 6. Localisation d'application sous Linux
- 7. bind ip au sous-domaine
- 8. quelle interface IP Helper API utiliser?
- 9. Développement sous GUI sous Linux
- 10. Commande Linux pour traduire DomainName en IP
- 11. Linux Real Mode Interface dans un module noyau Linux
- 12. Comment obtenir l'adresse mac pour une interface dans Linux en utilisant un programme C?
- 13. obtenir l'adresse IP globale
- 14. javascript obtenir ip client
- 15. Obtenir l'adresse IP-
- 16. Historique SQL * Plus sous Linux
- 17. Chemin utilisateur actuel sous Linux?
- 18. Performances Telnet sous Windows XP et Linux
- 19. Obtenir que Tomcat fonctionne correctement avec Netbeans 6.7 sous Linux
- 20. Obtenir l'adresse MAC sous Linux en utilisant le mode mono
- 21. Comment obtenir les informations CPU d'un processus sous Linux?
- 22. Obtenir des deltas de souris sous linux (xorg)
- 23. Obtenir PHP pour lire les fichiers .doc sous Linux
- 24. Comment obtenir la vitesse de l'interface réseau sous Linux?
- 25. Comment obtenir le chemin d'un processus sous Unix/Linux
- 26. Obtenir la cohérence de la synchronisation sous Linux
- 27. Comment créer des périphériques Ethernet virtuels sous Linux?
- 28. Assemblage sous Linux
- 29. C++ flash sous linux
- 30. Cookies Firefox sous Linux
pourquoi il y a un défaut de segmentation? – user138126
Donne un défaut de segmentation –
'#include' est manquant pour 'close()' –
Angs