【问题标题】:how do I get a remote global link addr by it's local-link addr?如何通过本地链接地址获取远程全局链接地址?
【发布时间】:2013-05-21 04:25:26
【问题描述】:

我得到一个路由信息协议(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;

}

【问题讨论】:

    标签: c ipv6 unix-socket


    【解决方案1】:

    两件事:

    • 您无法从链接本地地址获取全局地址,它们完全不相关
    • 可以使用链接本地地址进行路由

    使用本地链接地址的路由完全没有问题。除了本地链路下一跳地址之外,您唯一需要记住的是明确声明传出接口。

    以下是我的本地路由表中的几行(这是 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。这是我的电脑从路由器广告中学到的。

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

    【讨论】:

    • 我在嵌入式系统上使用定制的操作系统。它不允许我将本地链接地址设置为网关。也许我得请我的朋友来解决它。非常感谢,非常有帮助。
    • 如果您不能使用链接本地地址作为网关,那么这是一个错误。它是哪个操作系统?也许我可以帮忙。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-12
    • 1970-01-01
    • 2013-11-07
    • 2020-02-03
    • 2023-04-02
    相关资源
    最近更新 更多