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命令,就可以实时观察到路由的变化。
- linux和freebsd访问路由表的方式区别
- FreeBSD与Linux十个本质上的区别
- FreeBSD与Linux十个本质上的区别
- FreeBSD与Linux十个本质上的区别
- FreeBSD与Linux十个本质上的区别
- FreeBSD与Linux十个本质上的区别
- 静态路由和动态路由的区别
- 如何理解ip路由和操作linux的路由表
- 如何理解ip路由和操作linux的路由表
- 如何理解ip路由和操作linux的路由表
- 如何理解ip路由和操作linux的路由表
- 如何理解ip路由和操作linux的路由表
- 如何理解ip路由和操作linux的路由表
- Linux和FreeBSD在使用非系统自带的gcc时的区别
- Linux的路由和策略路由
- 转发和路由的区别
- 路由和交换机的区别
- 网关和路由的区别
- iphone 中字符串生成纹理图片
- Cassandra
- 2010最危险的编程错误
- 怎么识别军车拍照
- Python多线程学习(三、生产者与消费者)
- linux和freebsd访问路由表的方式区别
- SlickEdit 2009 宏
- 今天我的wireshark插件完成了,下一步计划搞个有点儿意思的动态库耍耍。
- Setup Cassandra on Windows
- 【资源收集】关于dll库中所包含函数与操作系统匹配的验证方法
- UVa 10474 Where is the Marble?
- ‘传感器“应该是”感传器“!
- 把SQL Server数据表的内容转换为相应的INSERT语句
- 浅谈 “我对 HOOKPE 的理解”