c++ - 如何检测全局与链路本地 IPv6 地址

标签 c++ c ipv6

我通过以下代码获取地址:

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, &(i_a), 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;
}
...

关于c++ - 如何检测全局与链路本地 IPv6 地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66324779/

相关文章:

c++ - fatal error :iostream:Code::Blocks 中没有这样的文件或目录

c++ - 编译器忽略 __stdcall

c++ - Actor 签名到更窄的签名

c - 尝试通过原始 IP 数据包发送数据时的 EMSGSIZE

java - 将 IPv6 转换为 long 并将 long 转换为 IPv6

ios - 您的应用程序在运行 iOS 11.2.5 并连接到 IPv6 网络的 iPad 或 iPhone 上崩溃了,但为什么呢?

c++ - 编译器错误 : unmatched call to pow(. ..)

c - 为什么分配大量char*时内存大小会翻倍?

c - 需要可用的软件逆向工程工具!

ipv6 - 了解如何制定 IPv6 地址的权威指南