gnienfo | J'ai trouve!! Avec getifaddrs() y'a moyen! voir "man getifaddrs" pour capter ce qui vous semble etrange ( et meme voir les include).
inclure:
Code :
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <ifaddrs.h>
|
voila le code :
Code :
- /*
- * Resolution d'adresse IPv6 locale
- * mode est juste un entier dont la macros
- * est a definir a sa sauce
- */
- struct in6_addr getLocalIP6(int mode) {
- struct ifaddrs *res = NULL;
- struct sockaddr_in6 *so;
- struct in6_addr ip;
- /* recuperation d'informations sur les interfaces */
- if ( getifaddrs(&res))
- printf("getifaddrs\n" );
- /* filtrage des adresses IPv6 dans la structure ifaddrs */
- for( ; res != NULL; res = res->ifa_next) {
- /* on compare avec "device" qui contient le nom
- * de l'interface qui nous concerne mais vous pouvez
- * mettre celle que vous voulez ou bien ne pas en mettre
- * du tout pour recuperer les infos sur toutes les interfaces
- */
- if ( !bcmp( res->ifa_name, device, sizeof(res->ifa_name) )
- && ( (res->ifa_addr)->sa_family == AF_INET6 ) ) {
- so = (struct sockaddr_in6 *)res->ifa_addr;
- /* on recupere soit l'adresse locale en fe80:~ */
- if (mode == LOCAL_LINK) {
- /* adresse lien local */
- if ( !bcmp(so->sin6_addr.s6_addr, "\xfe\x80", 2) ) {
- bcopy(so->sin6_addr.s6_addr, &ip, 16);
- break;
- }
- /* sinon on recupere l'adresse globale en 2001:~
- * ca peut aussi etre 3001:~ enfin vous voyez...
- */
- } else if (mode == GLOBAL) {
- /* adresse globale */
- if ( !bcmp(so->sin6_addr.s6_addr, "\x20", 1) ) {
- bcopy(so->sin6_addr.s6_addr, &ip, 16);
- break;
- }
- }
- }
- }
- freeifaddrs(res);
- return ip;
- }
|
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? |