2013-05-21 139 views
0

我得到一个路由信息协议(RIP)数据包,我可以从这个数据包中获取源路由器的链路本地地址。但我不能通过链路本地地址来设置路由,我需要源路由器的全局链路地址。我应该如何在C中编写代码?谢谢。 我做了一个尝试,但它不起作用。如何通过本地链接地址获得远程全局链接地址?

#include <sys/types.h> 
#include <sys/socket.h> 
#include <netdb.h> 
#include <stdio.h> 
#include <string.h> 
int main() { 
int sockfd; 
struct addrinfo hints, *servinfo, *p; 
int rv; 
char str[INET6_ADDRSTRLEN] = ""; 
char port[] = "521"; 
char addr[] ="fe80::a00:27ff:fe22:4d87"; 
struct sockaddr_in6 sa; 

memset(&hints, 0, sizeof hints); 
hints.ai_family = AF_INET6; 
hints.ai_socktype = SOCK_DGRAM; 
//inet_pton(AF_INET6, "fe80::a00:27ff:fe22:4d87", &(sa.sin6_addr)); 
//hints.ai_addr = (void *)&sa; 
hints.ai_flags = AI_NUMERICHOST; 

if ((rv = getaddrinfo(addr, NULL, &hints, &servinfo)) != 0) { 
    fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv)); 
    return 0; 
} 
for(p = servinfo; p != NULL; p = p->ai_next) { 
    if (p->ai_family == AF_INET6) { 
     inet_ntop(AF_INET6, (struct in6_addr *)p->ai_addr->sa_data, str, INET6_ADDRSTRLEN); 
     printf("%s\n", str); 
    } 
} 

freeaddrinfo(servinfo); // all done with this structure 
return 0; 

}

回答

3

两件事情:

  • 你不能从一个链路本地地址的全局地址,他们是
  • 可以航线使用链路完全无关本地地址

Routing usi ng链接本地地址完全没有问题。唯一需要记住的是除了本地链接本地下一跳地址之外,还要明确指定出接口。

下面是我的本地路由表中的几行(这是Mac OS X的,但概念是即Linux和Windows相同):

Internet6: 
Destination   Gateway       Flags Netif Expire 
default    fe80::222:83ff:feb5:964b%en0 UGc  en0 
::1     link#1       UHL  lo0 
2a00:8640:1::/64 link#4       UC  en0 

正如你可以看到我的默认网关是fe80::222:83ff:feb5:964b%en0 。这是我的PC从路由器广告中学到的东西。

在路由中,下一跳(或网关)地址实际上只用于确定下一跳。在以太网上,下一跳IPv6地址用于查找应该发送数据包的本地LAN上的MAC地址,并且使用链路本地地址完全没有问题。全球地址也可以使用,但不是必需的。如果你没有它:只需使用链接本地地址。

+0

我在嵌入式系统上使用定制的操作系统。它不允许我将本地链接地址设置为网关。也许我必须要求我的朋友修复它。非常感谢,非常有帮助。 – zack1030

+0

如果你不能使用链接本地地址作为网关,那么这是一个错误。它是哪个操作系统?也许我可以帮忙。 –