2013-01-21 50 views
1

我在IPv6網絡應用程序時,使用C.接入鏈路本地地址用c

現在按我的要求建的,我需要填充我的包的默認地址與系統的鏈路本地地址。

glibc是否有任何功能/庫可用於此目的。

我知道我能做到這一點使用system命令並運行,可以從系統訪問ifcfg-eth0的腳本,但我想這不會是advisible。

我是新來的所有這個套接字的東西,所以請原諒,如果缺少一些微不足道的東西。

編輯:

操作系統:Linux

,這實際上是用純粹的C套接字編程內置的開源實現sendip。現在,我正在修改它。符合我的要求。

http://snad.ncsl.nist.gov/ipv6/sendip.html

+0

這是如何關係到'kernel'? – Shahbaz

+0

我們可以有更多關於您的OS/IPv6庫的信息嗎? – Offirmo

+0

你需要什麼只是將你的套接字綁定到某個IP? –

回答

2

我想通了..... 其實我沒有,這個博客是實際上幫助我的那個博客。 我非常感謝他的建議。

http://valileo-valilei.blogspot.in/2010/09/getting-link-local-addres-from.html

這是一個實現:(我在這裏提供的代碼,因爲它可以幫助到很多其他人誰可能停留在類似的情況)

代碼:

#include "sys/types.h" 
#include "ifaddrs.h" 
#include <arpa/inet.h> 
#include <stdio.h> 
#include <malloc.h> 
#include <string.h> 

int get_link_local_addr(char* if_name, int if_name_length, 
         struct sockaddr_in6 *ip) { 

    struct ifaddrs *ifaddr, *ifa; 
    int ret = -2; 

    if (getifaddrs(&ifaddr) == -1) { 
      perror("getifaddrs"); 
      ret = -1; 
      freeifaddrs(ifaddr); 
      return ret; 
    } 

    for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) { 
      if (ifa->ifa_addr->sa_family != AF_INET6) continue; 

      if (strncmp(ifa->ifa_name, if_name, if_name_length)) continue; 

      struct sockaddr_in6 *current_addr = 
            (struct sockaddr_in6 *) ifa->ifa_addr; 

      if (!IN6_IS_ADDR_LINKLOCAL(&(current_addr->sin6_addr))) continue; 

      memcpy(ip, current_addr, sizeof(*current_addr)); 
      ret = 0; 
    } 

    freeifaddrs(ifaddr); 
    return ret; 
    } 


    int main() { 

    struct sockaddr_in6 *sa=(struct sockaddr_in6 *)malloc(40); 
    char *src,dst[INET6_ADDRSTRLEN]; 

    get_link_local_addr("wlan0",5,sa); 

    inet_ntop(AF_INET6, &(sa->sin6_addr), dst, INET6_ADDRSTRLEN); 

    printf("Link Layer Address is : %s\n",dst); 

    return 0; 

} 

輸出:

Link Layer Address is : fe80::d2df:9aff:fe56:917d

交叉檢查命令行:

$ ifconfig wlan0 
    wlan0 
     Link encap:Ethernet HWaddr d0:df:9a:56:91:7d 
     inet addr:172.31.9.171 Bcast:172.31.255.255 Mask:255.255.0.0 
     inet6 addr: 2001:df0:92:0:d2df:9aff:fe56:917d/64 Scope:Global 
     inet6 addr: fe80::d2df:9aff:fe56:917d/64 Scope:Link 
     inet6 addr: 2001:df0:92:0:50df:d286:a281:e6c0/64 Scope:Global 
     UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 
     RX packets:217235 errors:0 dropped:0 overruns:0 frame:0 
     TX packets:21173 errors:0 dropped:0 overruns:0 carrier:0 
     collisions:0 txqueuelen:1000 
     RX bytes:31550379 (31.5 MB) TX bytes:4062945 (4.0 MB) 
0

如果你有一個IPv6的應用程序,那麼你有一個IPv6的API(插座或東西)。

此API應具有獲取系統鏈接本地地址的功能。

小心多宿主。