OS X(MACOS) C/C++ 遍历系统所有的IP路由表配置。

 以下源实现为遍历MAC苹果电脑系统上配置的所有IP路由表配置,回调 predicate 过滤函数只在 AF_INET(IPV4)的时候跳出,其它时不处理,人们可以根据自己的需求改动。

无需依赖MAC OS框架库提供的函数,最小依赖才有可能更容易移植代码到 Apple Inc. 其它操作系统平台上面,另外是 MAC OS 平台依赖不容易受高版本限制。

        static int FetchAllRouteNtreeStuff(const ppp::function<bool(int interface_index, uint32_t ip, uint32_t gw, uint32_t mask)>& predicate) noexcept /* sysctlbyname("net.route.0.0.dump", buf, &len, NULL, 0) */
        {
            if (NULL == predicate)
            {
                return -1;
            }

            int mib[] = { CTL_NET, PF_ROUTE, 0, AF_INET, NET_RT_FLAGS, RTF_GATEWAY };
            size_t needed = 0;
            if (sysctl(mib, arraysizeof(mib), NULL, &needed, NULL, 0) < 0)
            {
                return -1;
            }

            std::shared_ptr<Byte> buffer_managed = ppp::make_shared_alloc<Byte>(needed);
            if (NULL == buffer_managed)
            {
                return -1;
            }

            char* buffer = (char*)buffer_managed.get();
            if (sysctl(mib, arraysizeof(mib), buffer, &needed, NULL, 0) < 0)
            {
                return -1;
            }

            struct rt_msghdr* rtm = NULL;
            char* buffer_needed = buffer + needed;

            for (char* i = buffer; i < buffer_needed; i += rtm->rtm_msglen)
            {
                rtm = (struct rt_msghdr*)(i); /* RTAX_NETMASK */
                if (rtm->rtm_type != RTM_GET)
                {
                    continue;
                }

                /* inet_ntop(AF_INET, &sa->sin_addr.s_addr, line, sizeof(line) - 1); */
                if (!(rtm->rtm_flags & RTF_UP))
                {
                    continue;
                }

                /* MAXHOSTNAMELEN; */
                if (!(rtm->rtm_flags & RTF_GATEWAY))
                {
                    continue;
                }

                struct sockaddr* sa_tab[RTAX_MAX];
                if (struct sockaddr* sa = (struct sockaddr*)(rtm + 1); NULL != sa)
                {
                    for (int j = 0; j < RTAX_MAX; j++)
                    {
                        if (rtm->rtm_addrs & (1 << j))
                        {
                            sa_tab[j] = sa;
                            sa = (struct sockaddr*)((char*)sa + ROUNDUP(sa->sa_len));
                        }
                        else
                        {
                            sa_tab[j] = NULL;
                        }
                    }
                }

                uint32_t ip = IPEndPoint::AnyAddress;
                uint32_t gw = IPEndPoint::AnyAddress;
                uint32_t mask = IPEndPoint::AnyAddress;
                if (rtm->rtm_addrs & (1 << RTAX_DST))
                {
                    struct sockaddr_in* sa = (struct sockaddr_in*)(sa_tab[RTAX_DST]);
                    if (sa->sin_family != AF_INET)
                    {
                        continue;
                    }

                    ip = sa->sin_addr.s_addr;
                }

                if (rtm->rtm_addrs & (1 << RTAX_GATEWAY))
                {
                    struct sockaddr_in* sa = (struct sockaddr_in*)(sa_tab[RTAX_GATEWAY]);
                    if (sa->sin_family != AF_INET)
                    {
                        continue;
                    }

                    gw = sa->sin_addr.s_addr;
                }

                if (rtm->rtm_addrs & (1 << RTAX_NETMASK))
                {
                    struct sockaddr_in* sa = (struct sockaddr_in*)(sa_tab[RTAX_NETMASK]);
                    mask = sa->sin_addr.s_addr;
                }

                if (predicate(rtm->rtm_index, ip, gw, mask))
                {
                    break;
                }
            }

            return 0;
        }

相关推荐

  1. OS X(MACOS) C/C++ 系统所有IP配置

    2024-02-20 05:56:05       26 阅读
  2. 获取 Linux 系统所有网络命名空间

    2024-02-20 05:56:05       41 阅读
  3. IP原理

    2024-02-20 05:56:05       9 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-02-20 05:56:05       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-02-20 05:56:05       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-02-20 05:56:05       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-02-20 05:56:05       20 阅读

热门阅读

  1. php8.2 安装swoole扩展 (mac m1)

    2024-02-20 05:56:05       38 阅读
  2. 【牛客】寒假训练营3 J-智乃的相亲活动 题解

    2024-02-20 05:56:05       33 阅读
  3. 利用ChatGPT提升工作效率

    2024-02-20 05:56:05       33 阅读
  4. 搜索+哈希/平衡树,LeetCode 987. 二叉树的垂序遍历

    2024-02-20 05:56:05       33 阅读
  5. 大数据经责审计

    2024-02-20 05:56:05       34 阅读
  6. the file size exceeds the configured limit Android studio

    2024-02-20 05:56:05       24 阅读
  7. c++ %运算符

    2024-02-20 05:56:05       27 阅读