【问题标题】:Find default gateway ip address, rather than parsing proc filesystem查找默认网关 ip 地址,而不是解析 proc 文件系统
【发布时间】:2012-05-09 09:50:29
【问题描述】:

我应该如何获取默认网关的IP地址?除了从 /proc 读取条目,还有什么独立的 API 可用吗?

【问题讨论】:

  • 你可以用 libiproute2 做到这一点
  • 我强烈建议只使用/proc。这是首选方法,其他方法往往需要特权访问。
  • 理论上,可以有许多对称配置的接口来增加容量和/或冗余。
  • /proc/net/route 是一种选择,但更好的是使用此处的示例代码:linuxquestions.org/questions/linux-networking-3/…

标签: c linux default routes


【解决方案1】:

您可以使用libnl,这是一个通过 NETLINK 套接字与内核通信的库。

获取默认路由的一个简单示例是(请添加错误检查和所需的标头)

   void cb_route (struct nl_object *cb, void *arg) {
        struct rtnl_route *route = (struct rtnl_route*) cb;
        /* do what you need to do with rtnl_route object 
         * e.g. copy it to arg, etc.
         */
        struct nl_addr *tmp_addr;
        tmp_addr = rtnl_route_get_gateway(route);
        len = nl_addr_get_len(tmp_addr);
        memcpy(arg, nl_addr_get_binary_addr(tmp_addr), len);
   }

   int get_route () {
        struct nl_handle *nlh;
        struct nl_cache *route_cache;
        struct rtnl_route *filter;
        struct nl_addr *dst;
        char *gw = malloc(16); //enough room for IPv6 if needed
        char n = '0';

        nlh = nl_handle_alloc();
        if (!nlh)
            return -1;

        nl_connect(nlh, NETLINK_ROUTE);
        route_cache = rtnl_route_alloc_cache();

        if (nl_cache_is_empty(route_cache))
             return 0;

        dst = nl_addr_build(AF_INET, &n, 0);
        filter = rtnl_route_alloc();
        rtnl_route_set_scope(filter, RT_SCOPE_UNIVERSE);
        rtnl_route_set_family(filter, AF_INET);
        rtnl_route_set_table(filter, RT_TABLE_MAIN);
        rtnl_route_set_dst(filter, dst);

        nl_cache_foreach_filter(route_cache, (struct nl_object*) filter, cb_filter_route, gw);
        /* gw should now contain the binary representation of the default gw. use inet_ntop to convert it */

        return 0;
  }

【讨论】:

  • 您能否提供一个适用于 libnl3 的示例? nl_socket_alloc() 而不是 nl_handle_alloc()。 libnl3 中rtnl_route_get_gateway 的类比是什么?
【解决方案2】:

一个技巧是使用 sockets api 来尝试连接到一个无法访问的 ip。 “无法到达的目的地”的响应将来自您的默认网关。

【讨论】:

  • 不一定。在存在多个网关的情况下,默认网关甚至可能不会进入画面。
  • 同意,但我的意思是确保并使用仅由默认网关响应的目标网络地址。此外,默认网关使用是普通用户访问 Internet 的常见情况
猜你喜欢
  • 2016-01-29
  • 1970-01-01
  • 1970-01-01
  • 2012-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-22
  • 1970-01-01
相关资源
最近更新 更多