- 论坛徽章:
- 0
|
我在用ioctl实现添加路由的时候遇到这么个问题:
如果路由flag用的是RTF_UP | RTP_HOST,这时候是可以添加路由的,但是这时候netmask是255.255.255.255
也就说destination是一个host.而我想加入一个destination是net而不是host的路由,而且netmask由我自己
设置,这时候我把路由flag设置为RTF_UP,然后执行的时候就总是出错,错误码是22,说是参数有错误.
请问大侠这是怎么回事?
请不吝赐教 谢谢!
测试代码:
#include <stdio.h>;
#include <unistd.h>;
#include <stdlib.h>;
#include <net/route.h>;
#include <string.h>;
#include <sys/types.h>;
#include <sys/socket.h>;
#include <errno.h>;
#include <sys/ioctl.h>;
#include <linux/sockios.h>;
#define MYPORT 0
int main()
{
int sockfd;
struct rtentry rt;
char dev_name[10];
memset(dev_name,'\0',sizeof(dev_name));
strcpy(dev_name,"eth0" ;
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if( -1 == sockfd )
printf("Create Socket Error. Code is %d \n",errno);
/*define the RouteEntry Params*/
memset(&rt,'\0',sizeof(struct rtentry));
rt.rt_dev = dev_name;
rt.rt_flags = RTF_UP | RTF_HOST;
#if 1
((struct sockaddr_in *) &rt.rt_gateway)->;sin_family = AF_INET;
((struct sockaddr_in *) &rt.rt_gateway)->;sin_addr.s_addr = inet_addr("0.0.0.0" ;
bzero(((struct sockaddr_in *) &rt.rt_gateway)->;sin_zero, ;
#endif
((struct sockaddr_in *) &rt.rt_dst)->;sin_family = AF_INET;
((struct sockaddr_in *) &rt.rt_dst)->;sin_addr.s_addr = inet_addr("192.216.225.0" ;
bzero(((struct sockaddr_in *) &rt.rt_dst)->;sin_zero, ;
#if 1
((struct sockaddr_in *) &rt.rt_genmask)->;sin_family = AF_INET;
((struct sockaddr_in *) &rt.rt_genmask)->;sin_addr.s_addr = inet_addr("255.255.225.0" ;
bzero(((struct sockaddr_in *) &rt.rt_genmask)->;sin_zero, ;
#endif
if( -1 == ioctl(sockfd,SIOCADDRT,&rt))
printf("Add Route Error .Code is %d\n",errno);
else
printf("Add Route Successfully.\n" ;
close(sockfd);
exit(EXIT_SUCCESS);
} |
|