Как определить (используя C API) системный сетевой адаптер по умолчанию? - PullRequest
0 голосов
/ 08 октября 2010

В Linux после установки аренды DHCP, когда я запускаю команду route, в последней строке указывается маршрут системы по умолчанию и сетевой адаптер.

например.,

Kernel IP routing table
Destination    Gateway         Genmask        Flags Metric Ref   Use IFace
142.157.138.0  *               255.255.254.0  U     2      0       0 wlan0
link-local     *               255.255.0.0    U     1000   0       0 wlan0
default        142.157.138.1   0.0.0.0        UG    0      0       0 wlan0

Есть ли способ получить NIC с пометкой "по умолчанию" через C API, вместо того, чтобы запускать route и анализировать вывод?

Спасибо.

(Интересует Linux и Darwin, в конце концов Windows.)

1 Ответ

4 голосов
/ 08 октября 2010

Я не знаю, не по себе, но вы могли бы изучить источник.На моем Ubuntu route предоставляется net-tools:

~$ which route
/sbin/route
~$ dpkg -S /sbin/route
net-tools: /sbin/route

Чтобы вы могли создать каталог где-нибудь, запустите apt-get source net-tools.Потом я заглянул в источник, и route.c выглядело как хорошее место для начала.Если аргументы route не передаются, он вызывает route_info() для данного семейства адресов и параметров, поэтому grep для этого:

~/z$ grep -r route_info *
lib/net-support.h:extern int route_info(const char *afname, int flags);
lib/getroute.c: *960221 {1.02} Bernd Eckenfels:        renamed from route_info to getroute.c
lib/getroute.c:int route_info(const char *afname, int options)
netstat.c: *960204 {1.10} Bernd Eckenfels:        aftrans, usage, new route_info, 
netstat.c:      i = route_info(afname, options);
route.c: *       {1.79} Bernd Eckenfels:        route_info
route.c:    i = route_info(afname, options);

Отлично.lib/getroute.c выглядит многообещающе.Похоже, он выбирает, какую функцию вызывать, основываясь на таблице указателей функций, отсортированной по семейству адресов.Давайте найдем IPv4:

inet_aftype.rprint = INET_rprint;

Итак, нам нужно найти определение INET_rprint.grep доставляет: это в lib/inet_gr.c.Самая интересная вещь здесь - это fopen(_PATH_PROCNET_ROUTE, "r"), который определяется в lib/pathnames.h как /proc/net/route.proc_gen_fmt, определенное в lib/proc.c, используется для облегчения синтаксического анализа вывода.

Итак, ваш ответ, по крайней мере на моем компьютере с GNU / Linux, должен выглядеть так: /proc/net/route.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...