UNP学习 路由套接口

一、概述

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

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[12];          /* 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);

 

转载于:https://www.cnblogs.com/ch122633/p/8589642.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值