Найти IP-адрес шлюза по умолчанию, а не parsing файловой системы proc

Как получить ip-адрес шлюза по умолчанию? Вместо того, чтобы читать записи из / proc, можно ли использовать автономный API?

    вы можете использовать libnl, который является библиотекой для связи с kernelм через сокеты 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 * eg 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; } 

    Трюк будет заключаться в использовании сокетов api, чтобы попытаться подключиться к недостижимому ip. Ответ «недоступного адресата» будет получен из вашего шлюза по умолчанию.