linux和freebsd访问路由表的方式区别

来源:互联网 发布:mac打印机驱动打不开 编辑:程序博客网 时间:2024/05/16 10:17

在linux下,使用socket建立连接,然后使用ioctl方式把新的路由写到系统的路由表中。
程序如下:
#include <sys/ioctl.h>;
#include <string.h>;
#include <stdlib.h>;
#include <errno.h>;
#include <stdio.h>;
#include <sys/socket.h>;
#include <netinet/in.h>;
#include <arpa/inet.h>;
#include <unistd.h>;
#include <net/route.h>;
#define E_ERR   1

int main(){
struct rtentry  rt;
struct sockaddr_in * my_addr;
int sock_fd;
char devi[] = "en0";

if ((sock_fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0){       
perror("socket");
close(sock_fd);
return E_ERR; 
}       

rt.rt_flags = (RTF_UP | RTF_GATEWAY | RTF_DEFAULT | RTF_HOST);
inet_aton("3.3.3.3",my_addr->;sin_addr);
memcpy(rt.rt_dst,my_addr, sizeof(struct sockaddr));

inet_aton("172.16.1.100",my_addr->sin_addr);
memcpy(rt.rt_gateway,my_addr,sizeof(struct sockaddr));

inet_aton("255.255.255.255",my_addr->sin_addr);
memcpy(rt.rt_genmask,my_addr,sizeof(struct sockaddr));

rt.rt_dev = devi;

if (ioctl(sock_fd, SIOCADDRT, rt) < 0){
perror("SIOCADDRT");
close(sock_fd);
return E_ERR;
}
return 0;
}

在freebsd下,也是使用socket建立连接,但是使用write方式把新的路由写到系统的路由表中。
#include <sys/types.h>
#include <sys/socket.h>
#include <net/route.h>
#include <net/if.h>
#include <netinet/in.h>
int main(int argc, char **argv) {
int    s;
char  buf[1024];
struct rt_msghdr *rtm;
struct sockaddr_in *sin1, *sin2;

if (argc != 3) {
printf("usage: %s <destinationIP> <gatewayIP>/n", argv[0]);
return -1;
}

if ((s = socket(AF_ROUTE, SOCK_RAW, AF_UNSPEC)) < 0) {
perror("failed to create socket");
return -1;
}

rtm = (struct rt_msghdr *)buf;
rtm->rtm_msglen = sizeof(struct rt_msghdr) + (2 * sizeof(struct sockaddr_in));
rtm->rtm_version = RTM_VERSION;
rtm->rtm_type = RTM_ADD;
rtm->rtm_addrs = (RTA_DST | RTA_GATEWAY);
rtm->rtm_rmx.rmx_hopcount = 1;
rtm->rtm_pid = getpid();
rtm->rtm_errno = 0;
rtm->rtm_seq = 0001;

/*
 * the destination address being added follows
 * the routing header
 */
sin1 = (struct sockaddr_in *)(rtm + 1);
sin1->sin_family = AF_INET;
sin1->sin_addr.s_addr = inet_addr(argv[1]);

/*
 * the gateway address being added follows the
 * destination address
 */
sin2 = (struct sockaddr_in *)(sin1 + 1);
sin2->sin_family = AF_INET;
sin2->sin_addr.s_addr = inet_addr(argv[2]);

if (write(s, (caddr_t)rtm, rtm->rtm_msglen) < 0) {
perror("Failed to send routing message");
return -1;
}

return 0;
}

然后,在freebsd或linux下,使用route monitor命令,就可以实时观察到路由的变化。

原创粉丝点击