bonsoir
je travail sur un projet sous c++ et je veux savoir est ce qu'il y a une methode pour récupérer l'adresse ip de la machine local
merci vos réponse
bonsoir
je travail sur un projet sous c++ et je veux savoir est ce qu'il y a une methode pour récupérer l'adresse ip de la machine local
merci vos réponse
Les choses sont pas aussi simples. L'adresse ip ne fait pas référence à une machine, mais à une interface (pour simplifier : une carte réseau).
Ta machine a plusieurs interfaces. Tu as probablement un port ethernet, peut-être un accès wifi. Il y a aussi une interface virtuelle nommée loopback dont l'adresse IP est 127.0.0.1.
Comment ça se fait que tu te trouves dans cette situation ?
Récupérer l'adresse IP de la machine n'a pas de sens, comme le fait remarquer phi1981. Non seulement tu peux avoir plusieurs interfaces, mais (en IPv6) tu peux avoir plusieurs adresses par interface.
La chose que tu peux faire, c'est énumérer les interfaces et les adresses sur ces interfaces.
Sous Linux, c'est relativement simple : ça se résume à envoyer un ioctl. Un exemple est donné ici (http://codingrelic.geekhold.com/2010...ocgifconf.html)
Voir http://linux.die.net/man/7/netdevice pour d'autres d'infos.
Pour avoir la liste des IPv6, il faut parser un fichier : (/proc/net/if_inet6 : contient la liste des adresse IPv6 de toutes les interfaces)
Sous Windows, une possibilité est de passer par le Network List Manager (http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx). Plus simplement, la fonction GetIpAddrTable() semble faire ce que tu veux (http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx).
normalement je n’aurais pas de problème par ce que je veux récupérer IP adresse des machine enregistrées dans domaine(réseau LAN) et donc je vais se baser sur la carte réseau ethernet
Bonjour,
Hier j'ai cherché à faire la même chose et j'ai trouvé sur StackOverflow une réponse.
Voilà comment on peut faire sous Linux :
Bien sur on peut changer le "wlan0" par le nom d'une autre interface.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 #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); }
Pourquoi ne pas interroger le serveur DNS avec la commande:
system("nslookup $HOST"), ainsi tu auras toujours l'adresse l'adresse IP "connue" sur le réseau.
Si tu as plusieurs cartes réseau, et que la femme de ménage débranche malencontreusement le câble et le rebranche sur l'autre carte, ben ce sera l'adresse IP de la carte connectée au réseau avec DNS qui sera utilisée !
Problème : que se passe-t-il si le réseau est down au moment où l'appel est fait ?
L'interface a quand même une adresse IP publique, mais impossible de faire un nslookup. Il faut donc s'intéresser à ce que propose l'OS pour effectuer cette tâche. D'où les solutions proposées ci-dessus.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager