路由套接字主要是为了操作内核中的路由子系统而创建,它提供以下功能:
1,进程可以通过路由套接字读取内核信息,获取类似ICMP重定向等信息(需root权限)。
2,进程可以通过路由套接字发送消息给内核,用来增加或者删除路径(需root权限)。
3,进程可以通过sysctl倾泻路由表或列出所有已配置的接口。
数据链路层套接字地址结构
#include <net/if_dl.h>
struct sockaddr_dl{
uint8_t sdl_len;
sa_family_t sdl_family;//AF_LINK
uint16_t sdl_index;//systemassigned index;
uint8_t sdl_type;//IFT_ETHER, 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
};
/*************************************************************
* file: route_socket.c
* brief:路由套接字
* yejing@2015.3.28 1.0 creat
*************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <net/route.h>
#include <sys/socket.h>
#include <net/if_dl.h>
int main(int argc, char* argv[]){
int sockfd;
pid_t pid;
struct rt_msghdr *rtm;
char* buf = (char *)malloc(sizeof(struct rt_msghdr) + 512);
if(!buf){
fprintf(stderr, "malloc error. \n");
return -1;
}
rtm = (struct rt_msghdr *)buf;
rtm->rtm_msglen = sizeof(struct rt_msghdr) + sizeof(struct sockaddr_in);
rtm->rtm_version = RTM_VERSION;
rtm->rtm_type = RTM_GET;
rtm->rtm_addrs = RTA_DST;
rtm->rtm_pid = getpid();
rtm->rtm_seq = 1000;
sockfd = socket(AF_ROUTE, SOCK_RAW, 0);
}