问题描述
pcap_addr_t* addrs_ptr = device->addresses;
std::vector<std::string> deviceAddresses;
// Collect the device addresses into a string vector
while(addrs_ptr != nullptr)
{
if(addrs_ptr->addr->sa_family == AF_INET) // IPv4
{
char address_string4[INET_ADDRSTRLEN];
struct sockaddr_in *sa_in = (struct sockaddr_in*)addrs_ptr->addr;
struct in_addr i_a = sa_in->sin_addr;
inet_ntop(AF_INET,&(i_a),address_string4,INET_ADDRSTRLEN);
deviceAddresses.push_back(address_string4);
}
else if(addrs_ptr->addr->sa_family == AF_INET6) // IPv6
{
char address_string6[INET6_ADDRSTRLEN];
struct sockaddr_in6 *sa_in6 = (struct sockaddr_in6*)addrs_ptr->addr;
struct in6_addr i_a = sa_in6->sin6_addr;
sa_in6->sin6_flowinfo
inet_ntop(AF_INET6,address_string6,INET6_ADDRSTRLEN);
deviceAddresses.push_back(address_string6);
}
addrs_ptr = addrs_ptr->next;
}
对于 IPv6,我获得了两个地址,一个是全局地址,一个是本地链接地址。我如何区分代码中的两者?
解决方法
您可以使用 IN6_IS_ADDR_*
宏集对 IPv6 地址进行分类。在您的情况下,您需要 IN6_IS_ADDR_LINKLOCAL
:
#include <netinet/in.h>
...
struct in6_addr i_a = sa_in6->sin6_addr;
if(IN6_IS_ADDR_LINKLOCAL(&i_a)) {
addrs_ptr = addrs_ptr->next;
continue;
}
...
,
链接本地地址以字节“fe80”开头。