Вопрос в том, как я могу получить таблицу маршрутизации на MACOSX?
Я не имею в виду netstat -nr . Я имею в виду, как сделать это программно, используя C .
Первым делом я скачал исходные коды netstat с opensource.apple.com.
Я нашел void mroutepr (void) функцию в mroute.c .
Эта функция выглядит как функция, которая получает таблицу маршрутизации, но я не уверен.
Существует объявление массива:
struct vif viftable [CONFIG_MAXVIFS];
Но когда я попытался скомпилировать mroutepr, я обнаружил, что struct vif не объявлена в / usr / include / netinet / ip_mroute.h
Я добавил все необходимые включения. Я проверил это семь раз :))
Затем я проверяю исходный код ядра xnu.
Я нашел эту структуру в ядре xnu, в этом файле: xnu / bsd / netinet / ip_mroute.h.
Было полное определение struct vif.
Похоже, эта структура доступна только в режиме ядра.
Я озадачен.
Как struct vif может быть объявлена только для кода ядра? Как работает утилита netstat ?
Все вышеперечисленное неверно :)))
Решение находится в файле route.c.
ntreestuff (void) * Функция 1034 * является точкой входа для получения таблицы маршрутизации.
Затем в функции np_rtentry (rtm) мы печатаем таблицу на консоль.
static void ntreestuff(void)
{
size_t needed;
int mib[6];
char *buf, *next, *lim;
struct rt_msghdr2 *rtm;
mib[0] = CTL_NET;
mib[1] = PF_ROUTE;
mib[2] = 0;
mib[3] = 0;
mib[4] = NET_RT_DUMP2;
mib[5] = 0;
if (sysctl(mib, 6, NULL, &needed, NULL, 0) < 0)
{
err(1, "sysctl: net.route.0.0.dump estimate");
}
if ((buf = malloc(needed)) == 0)
{
err(2, "malloc(%lu)", (unsigned long)needed);
}
if (sysctl(mib, 6, buf, &needed, NULL, 0) < 0)
{
err(1, "sysctl: net.route.0.0.dump");
}
lim = buf + needed;
for (next = buf; next < lim; next += rtm->rtm_msglen)
{
rtm = (struct rt_msghdr2 *)next;
np_rtentry(rtm);
}
}