我想通了..... 其實我沒有,這個博客是實際上幫助我的那個博客。 我非常感謝他的建議。
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)
這是如何關係到'kernel'? – Shahbaz
我們可以有更多關於您的OS/IPv6庫的信息嗎? – Offirmo
你需要什麼只是將你的套接字綁定到某個IP? –