2013-05-21 6 views
0

Я получаю пакет протокола маршрутизации (RIP), и я могу получить локально-локальный адрес исходного маршрутизатора из этого пакета. Но я не могу установить маршрут с помощью link-local addr, мне нужна глобальная ссылка addr исходного маршрутизатора. Как написать код в C? Благодарю. Я попытался, но он не работает.Как получить удаленный глобальный адрес addr через локальную ссылку addr?

#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

две вещи:

  • Вы не можете получить глобальный адрес от локального адреса, они совершенно не связаны
  • Вы можете маршрут с использованием ссылка- местные адреса

Маршрутизация 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 , Это то, что мой компьютер узнал из рекламы в Router.

В маршрутизации адрес следующего перехода (или шлюза) используется только для определения следующего перехода. В ethernet адрес IPv6 следующего перехода используется для поиска MAC-адреса в локальной локальной сети, где пакет должен быть отправлен, а с помощью локального адреса ссылки для этого не проблема. Глобальный адрес также можно использовать, но не требуется. Если у вас его нет: просто используйте локальный адрес ссылки.

+0

Я использую индивидуальную операционную систему на встроенной системе. Это не позволяет мне устанавливать локальную ссылку addr в качестве шлюза. Может быть, мне придется попросить моих друзей исправить это. Большое вам спасибо, очень полезно. – zack1030

+0

Если вы не можете использовать локальный адрес ссылки в качестве шлюза, то это ошибка. Какая ОС это? Может быть, я могу помочь. –