网络掩码以无效格式在rt_msghdr2中返回

时间:2015-11-10 19:41:11

标签: ios c macos sysctl

我想在使用参数sysctl调用{ CTL_NET, PF_ROUTE, 0, AF_INET, NET_RT_DUMP2, 0 }函数时解析内核返回的路由。

执行此操作后,我收到了几条路由消息,在所有这些消息中我都发现了问题:索引struct sockaddr*的{​​{1}}并不包含有效的RTAX_NETMASK。< / p>

struct sockaddr返回的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 << i)) { sockAddrArray[i] = currentSockAddr; currentSockAddr = (struct sockaddr *)(ROUNDUP(currentSockAddr->sa_len) + (char *)currentSockAddr); } else { sockAddrArray[i] = NULL; } } 声明它有网络掩码,当我检查内容时,我发现它有类似这样的内容:

routeMsg

奇怪的是,主机上的匹配路由(基于网络和网关地址)具有网络掩码sockAddrArray[RTAX_NETMASK]->sa_len = 0 sockAddrArray[RTAX_NETMASK]->sa_type = \xff sockAddrArray[RTAX_NETMASK]->sa_data = { \xff, \xff, \0, ...} ,该网络掩码与网络掩码255.255.255.0的直接内容相匹配。

当然,我不相信数组中sockaddr之后的任何其他内容,因为它将被错误地解析。

有人知道为什么会这样吗?

0 个答案:

没有答案