[C] recuperer sa propre ipv6

recuperer sa propre ipv6 [C] - C - Programmation

Marsh Posté le 16-07-2004 à 14:13:42    

Bonjour,
J'ai bcp cherche et je n'ai pas trouve comment faire pour recuperer ma propre (celle de ma propre machine) adresse ipv6 sous forme de *char ou meme de libnet_in6_addr.
Existe-t-il des fonctions de la libnet, inet ou bien pcap? (sachant que la fonction libnet_getipaddr6() n'est pas implementee pour la libnet 1.1.2.1)
merci d'avance!

Reply

Marsh Posté le 16-07-2004 à 14:13:42   

Reply

Marsh Posté le 18-07-2004 à 11:41:31    

quel environnement ? note que rajouté ça dans libgtop CVS pour Linux, les autres implémentations suivront

Reply

Marsh Posté le 19-07-2004 à 16:39:47    

je bosse sous freeBSD 4.10

Reply

Marsh Posté le 19-07-2004 à 19:38:50    

ah. ben là je sais pas. si tu as la solution sans passer par quoi que ce soit d'extérieur, je suis intéressé

Reply

Marsh Posté le 22-07-2004 à 15:34:11    

J'ai trouve!! :bounce:  
 
Avec getifaddrs() y'a moyen!  :pt1cable:  
 
voir "man getifaddrs" pour capter  
ce qui vous semble etrange ( et meme voir les include).
 
inclure:  
 

Code :
  1. #include <sys/types.h>
  2. #include <sys/socket.h>
  3. #include <ifaddrs.h>


 
voila le code :
 

Code :
  1. /*
  2. * Resolution d'adresse IPv6 locale
  3. * mode est juste un entier dont la macros  
  4. * est a definir a sa sauce
  5. */
  6. struct in6_addr getLocalIP6(int mode) {
  7.   struct ifaddrs *res = NULL;
  8.   struct sockaddr_in6 *so;
  9.   struct in6_addr ip;
  10.   /* recuperation d'informations sur les interfaces */
  11.   if ( getifaddrs(&res))
  12.     printf("getifaddrs\n" );
  13.   /* filtrage des adresses IPv6 dans la structure ifaddrs */
  14.   for( ; res != NULL; res = res->ifa_next) {
  15.     /* on compare avec "device" qui contient le nom
  16.      * de l'interface qui nous concerne mais vous pouvez
  17.      * mettre celle que vous voulez ou bien ne pas en mettre
  18.      * du tout pour recuperer les infos sur toutes les interfaces
  19.      */
  20.     if ( !bcmp( res->ifa_name, device, sizeof(res->ifa_name) )
  21.         && ( (res->ifa_addr)->sa_family == AF_INET6 ) ) {
  22.       so = (struct sockaddr_in6 *)res->ifa_addr;
  23.       /* on recupere soit l'adresse locale en fe80:~ */
  24.       if (mode == LOCAL_LINK) {
  25.         /* adresse lien local */
  26.         if ( !bcmp(so->sin6_addr.s6_addr, "\xfe\x80", 2) ) {
  27.           bcopy(so->sin6_addr.s6_addr, &ip, 16);
  28.           break;
  29.         }
  30.       /* sinon on recupere l'adresse globale en 2001:~  
  31.        * ca peut aussi etre 3001:~ enfin vous voyez...
  32.        */
  33.       } else if (mode == GLOBAL) {
  34.         /* adresse globale */
  35.         if ( !bcmp(so->sin6_addr.s6_addr, "\x20", 1) ) {
  36.           bcopy(so->sin6_addr.s6_addr, &ip, 16);
  37.           break;
  38.         }
  39.       }
  40.     }
  41.   }
  42.   freeifaddrs(res);
  43.   return ip;
  44. }


 
bon il faudrait peut-etre tester si ca rend pas une adresse valide
mais bon l'important du code est la!
 
j'espere que ca aidera des gens!  
Taz peut-etre...
si vous avez besoin de complement d'info sur le code n'hesitez pas!
enfin jetez un coup d'oeil au man getifaddrs avant quand meme pour capter le principe des interfaces chainees...
 
P.S.:tu fais quoi en IPv6 sinon Taz?

Reply

Marsh Posté le 22-07-2004 à 15:38:53    

ben pareil que Linux quoi.
 
Ce que je fais ? j'ai une bibliothèque multiplateforme sur GNOME.
http://cvs.gnome.org/viewcvs/libgt [...] iew=markup

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed