一、概述

在路由套接口中支持三种类型的操作:

1.进程能通过写路由套接口想内核发消息。举例:路径就是这样增加和删除的。

2.进程能在路由套接口上从内核读消息。

3.进程可以用sysctl函数得到路由表或列出所有已配置的接口

二、数据链路套接口地址结构

路由套接口上返回的一些消息中包含数据链路套接口地址结构。它是在<net/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[]; /* minimun work area,can be larger;
contains i/f name and link-layer address */
};

每个接口都有一个唯一的大于0的索引号

三、读和写

进程在创建路由套接口后,可以通过读和写套接口向内核发命令或从核心读信息。它在<net/route.h>中定义

上图中对吼一列所示:rt_msghdr、if_msghdr和ifa_msghdr:

struct rt_msghdr {                /* from <net/route.h> */
u_short rtm_msglen; /* to skip over non-understood messages */
u_char rtm_version; /* funture binary compatibility */
u_char rtm_type; /* message type */
u_short rtm_index; /* index for associated ifp */
int rtm_flags; /* flags, incl. kern & message, e.g. , DONE */
int rtm_addrs; /* bitmask identifying sockaddrs in msg */
pid_t rtm_pid; /* identify sender */
int rtm_seq; /* for sender to identify action */
int rtm_errno; /* why failed */
int rtm_lnits; /* from rtentry */
u_long rtm_inits; /* which metrics we are initializing */
struct rt_metrics rtm_rmx; /* metrics themselves */
}; struct if_msghdr { /* from <net/if.h> */
u_short ifm_msglen; /* to skip over non-understood messages */
u_char ifm_version; /* future binary compatibility */
u_char ifm_type; /* message type */
int ifm_addrs; /* like rtm_addrs */
int ifm_flags; /* value of if_flags */
u_short ifm_index; /* index for associated ifp */
struct if_data ifm_data; /* statistics and other data about if */
}; struct ifa_msghdr { /* from <net/if.h> */
u_short ifam_msglen; /* to skip over non-understood messages */
u_char ifam_version; /* future binary compatibility */
u_char ifam_type; /* message type */
int ifam_addrs; /* link rtm_addrs */
int ifam_flags; /* value of ifa_flags */
u_short ifam_index; /* index for associated ifp */
int ifam_metric; /* value of ifa_metric */
};

rtm_addrs、ifm_addrs和ifam_addrs成员时位掩码,用来指明消息后的套接口地址结构时八种可能的类型中的哪一种。

在<net/route.h>头文件中为该位掩码定义的各常值的值。

三、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
name:指定名字的一个整数值
namelen:数组中的元素数目
oldp:需指向一个缓冲区,让内核存放该值
oldenp:是一个值-结果参数
newp:指向一个大小为newlen的缓冲区,如果没有指定新值,newp应为一个空指针,newlen应为0

对路由套接口的兴趣是对sysctl函数检查路由表和接口表。

四、接口名和索引函数

#include <net/if.h>

unsigned int if_nametoindex(const char *ifname);
返回:成功时为正的接口索引,出错为0 char *if_indextoname(unsigned int ifindex, char *ifname);
返回:成功时为指向接口名的指针,出错NULL struct if_nameindex *if_nameindex(void);
返回:成功时为非空指针,出错为NULL void if_freenameindex(struct if_nameindex *ptr);

UNP学习 路由套接口的更多相关文章

  1. 值得收藏的TCP套接口编程文章

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由jackieluo发表于云+社区专栏 TCP客户端-服务器典型事件 下图是TCP客户端与服务器之间交互的一系列典型事件时间表: 首先启 ...

  2. UNIX网络编程读书笔记:套接口地址结构

    前言 大多数套接口函数都需要一个指向套接口地址结构的指针作为参数.每个协议族都定义它自己的套接口地址结构.这些结构的名字均以"sockaddr_"开头,并以对应每个协议族的唯一后缀 ...

  3. UNP学习笔记(第十八章 路由套接字)

    路由套接字上支持3种类型的操作 1). 进程能通过写路由套接字向内核发消息. 2). 进程能通过路由套接字从内核读消息. 3). 进程可以用sysctl函数得到路由表或列出所有已配置的接口. 数据链路 ...

  4. UNP学习笔记(第七章 套接字选项)

    有多种方法获取和设置影响套接字的选项: 1.getsockopt和setsockopt函数 2.fcntl函数 3.ioctl函数 getsockopt和setsockopt函数 这两个函数仅用于套接 ...

  5. UNP学习笔记1——基本TCP套接字编程

    1 套接字地址结构 大多数套接字函数都需要一个指向套接字地址结构的指针作为参数.每个协议族都定义了自己的套接字结构.这些套接字的结构以sockaddr_开头,以每个协议族唯一的后缀名结尾. 1.1 I ...

  6. UNP学习笔记(第十七章 ioctl操作)

    ioctl相当于一个杂物箱,它一直作为那些不适合归入其他精细定义类别的特性的系统接口. 本章笔记先放着,到时候有需要再看 ioctl函数 #include <unistd.h> int i ...

  7. UNP学习 多播

    一.概述 单播地址标识单个接口,广播地址标识子网上的所有接口,多播地址标识一组接口. 单播和广播是编址方案的两个极端,多播的目的就在于提供一种折衷的方案. 二.多播地址 我们必须区分IPv4多播地址和 ...

  8. UNP学习 ioctl操作

    一.ioctl函数 #include <unistd.h> int ioctl(int fd, int request, ... /* void * arg */); 返回:成功0,出错- ...

  9. UNP学习第13章 守护进程和inetd超级服务器

    Unix系统中的syslogd守护进程通常由某个系统初始化脚本启动,而且在系统工作期间一直运行. 源自Berkeley的syslogd实现在启动时执行以下步骤. (1)读取配置文件.通常为/etc/s ...

随机推荐

  1. JS中的一些遍历方法

    1.遍历数组 以下遍历方法中for循环性能最好,而且优化版for循环性能最高.只有forEach不能跳出循环. 在循环数组时,如果在循环过程中对数组进行了增删改,那么在后面的每次循环中,进行操作的都是 ...

  2. Codeforces 803E--Roma and Poker (DP)

    原题链接:http://codeforces.com/problemset/problem/803/E 题意:给一个n长度的字符串,其中'?'可以替换成'D'.'W'.'L'中的任意一种,'D'等价于 ...

  3. Linux下安装xwindow图形界面

    执行命令 yum -y groupinstall Desktop yum -y groupinstall "X Window System" 然后执行"startx&qu ...

  4. ucenter 整合同步登录的内部实现原理

    1.用户登录discuz,通过logging.php文件中的函数uc_user_login对post过来的数据进行验证,也就是对username和password进行验证. 2.如果验证成功,将调用位 ...

  5. 对GridFS数据进行分片

    On this page files 集合 chunks 集合 在对 GridFS 存储进行分片时,需要注意以下的情况: files 集合 大多数情况下不需要对 files 集合进行分片,这个集合通常 ...

  6. five hundred miles

  7. 控制 if 语句 while循环 break continue

    if 语句的语法: 1. if 条件 :   #引号是将条件与结果分开 代码块   # 四个空格,或者一个tab键,这个是告诉程序满足这个条件的 说明: 当条件成立的时候(True), 代码块会被执行 ...

  8. docker-container 操作

    1.把container放后台运行 [root@localhost dockerfile3]# docker run bigni/python_flask #默认运行image,container里运 ...

  9. Java Console/控制台 打印表格

    功能:控制台打印表格,支持字段动态长度,左对齐,右对齐,居中,设置最大列长,设置列间隔符,设置最多打印多少行. 类下载地址:http://download.csdn.net/download/j506 ...

  10. C#设计模式:状态者模式(State Pattern)

    一,什么是状态设计模式? 1,定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新. 2,当一个对象的内部状态改变时允许改变其行为,这个对象看起来像是 ...