我想在使用参数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
之后的任何其他内容,因为它将被错误地解析。
有人知道为什么会这样吗?