UNP卷一chapter18 路由套接字

相比较第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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值