UNPv1第十七章:路由套接口
来源:互联网 发布:node in action中文版 编辑:程序博客网 时间:2024/06/05 19:05
1.概述
在路由器接口中支持三种类型的操作
1). 进程能通过写路由套接口向内核发消息。
2). 进程能在路由套接口上从内核读消息,这是核心通知进程已收到一个ICMP重定向消息并进行了处理的方式。
3). 进程可以用sysctl函数得到路由表或列出所有已配置的接口。
2.数据链路套接口地址结构
在路由套接口上返回的一些消息中包含数据链路套接口地址结构,他在
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, etc. 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 if name and link-layer address */};
每个接口都有一个唯一的大于0的索引号。sdl_data成员包含名字和链路层地址,名字从sdl_data[0]开始,而且不以空字符终止。链路层地址从名字后面的sdl_nlen字节开始。这些套接口地址结构是可变长度的。
3.sysctl操作
我们对于路由套接口的主要兴趣点在于使用sysctl函数检查路由表和接口清单,使用该函数检查路由表清单不需要超级用户权限。
#include <sys/param.h>#include <sys/sysctl.h>int sysctl(int *name, u_int namelen, void *oldp, size_t *oldlenp, void *newp, size_t newlen);//返回:若成功为0,若出错-1
这个函数使用类似SNMP(简单网络管理协议)MIB(管理信息库)的名字
参数name是指定名字的一个整数数组,namelen是数组中的元素数目。数组的第一个元素指明请求被发往内核的哪个子系统
第二个参数指明这个子系统的某个部分,依次类推。
要取一个值,oldp需指向一个缓冲区,以让内核存放该值。
oldlenp是一个值-结果参数:调用函数时oldlenp指向的值是缓冲区的大小,返回的值是内核在缓冲区中返回的数据量,如果缓冲区不够大,就返回ENOMEM错误。作为一个特例,oldp可以是一个空指针而oldlenp是一个非空指针,内核确定这个调用本应返回的数据量,并通过oldlenp返回这个值。
要设置一个新值,newp需指向一个大小为newlen的缓冲区,如果没有指定新值,newp应为一个空指针,newlen应为0
4.接口名字和索引函数
下面四个函数用于需要描述一个解耦的场合,这里存在一个概念,即每个接口都有一个唯一的名字和一个唯一的正值索引(0从不用做索引)
#include <net/if.h>unsigned int if_nametoindex(const char * ifname); // 返回:成功时为正的接口索引,出错时为0char * if_indextoname(unsigned int ifindex, char * ifname); // 返回: 成功时为指向接口名的指针,出错时为NULLstruct if_nameindex * if_nameindex(void); //返回: 成功时为非空指针,出错时为NULLvoid if_freenameindex(struct if_nameindex * ptr);
if_nametoindex返回名为ifname的接口的索引,if_indextoname对给定的ifindex返回一个指向其接口名的指针,ifname参数指向一个大小为IFNAMSIZ头文件中定义的缓冲区,调用者必须分配这个缓冲区以保存结果,成功时这个指针也是函数的返回值,if_nameindex返回一个指向if_nameindex结构的数组的指针
struct if_nameindex{ unsigned int if_index; /* 1,2... */ char * if_name; /* null terninated name: "le0", ... */};
数组的最后一项是一个index为0,if_name为空指针的结构。这个数组和数组中各元素指向的名字所用的内存是动态分配的,调用if_freenameindex可释放这些内存
- UNPv1第十七章:路由套接口
- UNPv1第七章:套接口选项
- UNPv1第二十五章:原始套接口
- UNPv1第四章:基本TCP套接口编程
- UNPv1第八章:基本UDP套接口编程
- UNPv1第二十章:高级UDP套接口编程
- 路由套接口 unp17
- 第十七套
- 第十七章 路由交换机编程
- UNPv1第十八章:广播
- UNPv1第二十三章:线程
- 套接口
- UNPv1第二章:传输层
- UNPv1第十二章:守护进程
- UNPv1第十三章:高级IO
- UNPv1第十九章:多播
- 第7章:套接口选项设置
- 第8章:UDP套接口
- spark streaming初试之wordcount
- Transaction 那点事儿【写的太好了】
- #include <string> 和 #include <string.h>
- Mule 官方例子研究
- 整理的AES对称加密和RSA非对称加密
- UNPv1第十七章:路由套接口
- Linux nano 命令大全
- linux 数组的初始化和遍历
- 安卓里面的事件分发初体验
- linux awk 内置函数详细介绍(实例)
- HDU-5672-String(模拟/追赶)
- Xmanager的安装配置和使用
- java基础(27)--JMX
- map结构快速入门