我收到一个路由信息协议(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;}
发布于 2013-05-21 18:51:53
两件事:
进行路由
使用本地链路地址进行路由完全没有问题。除了本地链路的下一跳地址之外,您需要记住的唯一一件事就是明确说明传出接口。
以下是我的本地路由表中的几行(这是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地址用于查找应该发送数据包的本地局域网上的MAC地址,为此使用本地链路地址根本不成问题。也可以使用全局地址,但不是必需的。如果您没有这个地址:只需使用本地链路地址。
https://stackoverflow.com/questions/16662143
复制相似问题