omo obter a tabela de roteamento no MACOSX (programaticament
A questão é como posso obter a tabela de roteamento no MACOSX? Não quero dizernetstat -nr. Quero dizer como fazê-lo programaticamente usandoC. Primeiro, baixei os códigos-fonte do netstat no opensource.apple.com. Eu encontreivoid mroutepr (vazio) função em mroute.c.
Esta função se parece com a função que obtém a tabela de roteamento, mas não tenho certez
Há uma declaração de matriz:struct vif viftable [CONFIG_MAXVIFS];
Mas quando tentei compilar o mroutepr, revelei que struct vif não é declarado em / usr / include / netinet / ip_mroute.h Eu adicionei todas as inclusões necessárias. Eu o verifiquei sete vezes:))
Então eu verifico o código fonte do kernel xnu. Eu encontrei essa estrutura no kernel xnu, neste arquivo: xnu / bsd / netinet / ip_mroute.h. Havia uma definição completa de struct vif.
arece que essa estrutura está disponível apenas no modo kerne
Estou confuso
Como o struct vif pode ser declarado apenas para o código do kernel? Como netstat utilitário funciona?
Todos os itens acima estão incorretos :))) A solução está no arquivo route.
ntreestuff (vazio) função @ é o ponto de entrada para obter a tabela de roteamento. Então emnp_rtentry (rtm) função imprimimos tabela no consol
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);
}
}