Код для извлечения адресов из struct rt_msghdr2 возвращается с помощью sysctl :
Код: Выделить всё
// ROUNDUP Taken from route.c
#define ROUNDUP(a) \
((a) > 0 ? (1 + (((a) - 1) | (sizeof(uint32_t) - 1))) : sizeof(uint32_t))
struct rt_msghdr2* routeMsg = (struct rt_msgdr2*)buffer;
struct sockaddr* sockAddrArray[RTAX_MAX];
memset(sockAddrArray, 0, sizeof(sockAddrArray));
struct sockaddr* currentSockAddr;
currentSockAddr = (struct sockaddr*)(routeMsg + 1);
for (int i = 0; i < RTAX_MAX; i++) {
if (routeMsg->rtm_addrs & (1 sa_len) + (char *)currentSockAddr);
}
else {
sockAddrArray[i] = NULL;
}
}
< /code>
Несмотря на то, что rootmesg < /code> утверждает, что у него есть сетка, когда я проверяю содержимое, я считаю, что в нем есть что -то вроде этого: < /p>
sockAddrArray[RTAX_NETMASK]->sa_len = 0
sockAddrArray[RTAX_NETMASK]->sa_type = \xff
sockAddrArray[RTAX_NETMASK]->sa_data = { \xff, \xff, \0, ...}
< /code>
Странная вещь заключается в том, что в соответствующем маршруте на хосте (на основе адресов сети и шлюза) есть сетчатая масска 255.255.255.0 < /code>, который слишком хорошо соответствует прямому содержанию сети Sockaddr < /code>. Rtax_netmask Подробнее здесь: https://stackoverflow.com/questions/336 ... lid-format
Мобильная версия