相比较第17章用ioctl函数获取整个路由表,利用sysctl函数也是可以做到而且无需超级用户权限。
1、路由套接字上支持3种类型的操作
i、进程可以通过写出到路由套接字而往内核发送消息。路径的增加和删除采用这种操作实现。
ii、进程可以通过从路由套接字读入来自内核接收消息。内核采用这种操作通知进程已收到并处理一个ICMP重定向消息,或者请求外部路由进程解析一个路径。
iii、进程可以使用sysctl函数倾泻出路由表或列出所有已配置的接口。
数据链路套接字地址结构(定义在net/if_dl.h文件中,我的机器上没有这文件,所以本章的程序都无法编译通过,需要的可以参考if_dl.h文件,如果已有的话,可以发份我,感激不尽!)
struct sockaddr_dl {
uint8_t sdl_len;
sa_family_t sdl_family;//AF_LINK
uint16_t sdl_index;//system assigned index, if>0
uint8_t sdl_type;//IFT_ETHER, ect. from <net/if_types.h>
uint8_t sdl_nlen;//name length, starting in sdl_data[0]
uint8_t sdl_alen;//link-layer address length
uint8_t sdl_slen;//link-layer selector length
char sdl_data[12];//minimum work area, can be larger
}; //contains i/f name and link-layer address
2、介绍路由套接字的相关信息
i、通过路由套接字交换的消息类型(见书上P383)
ii、在路由消息中用于指称套接字地址结构的常值(见书上P385)
iii、获取并输出一个路由表项的代码实现(没有用sysctl函数实现)
以下程序通过命令参数取得一个ipv4点分十进制数地址,并就这个地址向内核发送一个RTM_GET消息。内核在它的ipv4路由表中查找这个地址,并作为一个RTM_GET消息返回相应路由表项的信息。先见图,再见代码。
#include "unproute.h"
#define BUFLEN (sizeof(struct rt_msghdr) + 512)
/* sizeof(struct sockaddr_in6) * 8 = 192 */
#define SEQ 9999
int
main(int argc, char **argv)
{
int sockfd;
char *buf;
pid_t pid;
ssize_t n;
struct rt_msghdr *rtm;//rt_msghdr、if_msghdr、ifa_msghdr、ifma_msghdr和if_announcemsghdr的具体定义在书上P384,图18-3所示
struct sockaddr *sa, *rti_info[RTAX_MAX];
struct sockaddr_in *sin;
if (argc != 2)
err