免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6062 | 回复: 8
打印 上一主题 下一主题

[C] 编程实现添加一条路由 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-30 10:51 |只看该作者 |倒序浏览
10可用积分
Linux下写了一个程序,往路由表中添加一条记录。
用gcc -o iipp iipp.c -Wall 报错:
iipp.c: In function ‘main’:
iipp.c:22: warning: implicit declaration of function ‘inet_addr’
iipp.c:32: warning: implicit declaration of function ‘printf’
iipp.c:32: warning: incompatible implicit declaration of built-in function ‘printf’
iipp.c:35: warning: implicit declaration of function ‘ioctl’
iipp.c:36: warning: implicit declaration of function ‘close’
iipp.c:18: warning: unused variable ‘hp’’
能生成可执行文件 ./iipp后路由表中没有加入192.168.0.103这条路由
请大家帮忙看看出了什么问题,谢谢谢谢


#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include </usr/include/netdb.h>
#include <sys/param.h>
#include <sys/uio.h>
#include <sys/un.h>
#include <netdb.h>
#include   <netdb.h>
#include </usr/include/linux/route.h>
#include </usr/include/linux/sockios.h>
int   main()
{

                struct   rtentry   rt;
                memset((char   *)   &rt,   0,   sizeof(struct   rtentry));
                struct   sockaddr_in   addr;
                struct   hostent   *hp;
                int   sockfd;
                char   devid[]= "eth0 ";
                addr.sin_family   =   AF_INET;
                addr.sin_addr.s_addr   =   inet_addr( "192.168.0.103 ");

                rt.rt_flags   =(RTF_UP|RTF_GATEWAY);
                rt.rt_dev   =   devid;
                memcpy((char   *)   &rt.rt_dst,   (char   *)   &addr,   sizeof(struct   sockaddr_in));
                addr.sin_addr.s_addr   =   inet_addr( "192.168.0.254 ");
                memcpy((char   *)   &rt.rt_gateway,(char   *)     &addr,   sizeof(struct   sockaddr_in));
                sockfd   =   socket(AF_INET,   SOCK_DGRAM,   0);
                if(sockfd   <   0)
                {
                                printf( "socket   ERROR\n ");
                                return   0;
                }
                ioctl(sockfd,   SIOCADDRT   ,   &rt);
                close(sockfd);
                return   1;
}

[ 本帖最后由 skywalkerjj 于 2009-4-30 11:03 编辑 ]

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:53:172015亚冠之水原三星
日期:2015-06-02 16:34:202015年亚冠纪念徽章
日期:2015-10-19 18:13:37程序设计版块每日发帖之星
日期:2015-11-08 06:20:00
2 [报告]
发表于 2009-04-30 10:56 |只看该作者
你strace一下route 看看他是怎么做的

论坛徽章:
0
3 [报告]
发表于 2009-04-30 11:19 |只看该作者

回复 #2 xinglp 的帖子

初学菜鸟……不会使用strace……
在本论坛精华区里找到个很早以前例程:
#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[] = "eth0";





        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);

        my_addr->sin_family = AF_INET;



        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;

}
用gcc -o ip ip.c -Wall编译时出现警告:
ip.c:29: warning: large integer implicitly truncated to unsigned type
./ip 时出现Segmentation fault (core dumped)
麻烦帮忙看看~不胜感激

论坛徽章:
0
4 [报告]
发表于 2009-04-30 16:48 |只看该作者
解决了……精华区里的那个程序改成如下即可在ubuntu7.10下正常运行:
#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  dong;
        struct sockaddr_in * my_addr;
        my_addr=&dong;
        
   

        int sock_fd;

        char devi[] = "eth0";
        





        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);
        my_addr->sin_family = AF_INET;

        

        inet_aton("219.245.76.111",&my_addr->sin_addr);

        memcpy(&rt.rt_dst,my_addr, sizeof(struct sockaddr));



        inet_aton("219.245.76.254",&my_addr->sin_addr);

        memcpy(&rt.rt_gateway, my_addr, sizeof(struct sockaddr));



        inet_aton("255.255.255.0",&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;

}

论坛徽章:
0
5 [报告]
发表于 2009-04-30 16:57 |只看该作者

如何在此基础上实现添加网关呢?

现在可以成功添加一条路由上去,如何再完成添加网关呢?请大家帮帮忙,毕设要用,急~谢谢谢谢

论坛徽章:
0
6 [报告]
发表于 2009-05-07 20:33 |只看该作者
其实,你们有没有考虑过,不改变Linux系统本身的文件,来改变网络信息的“绿色软件”概念呢?

论坛徽章:
0
7 [报告]
发表于 2009-05-13 10:01 |只看该作者

回复 #4 skywalkerjj 的帖子

我是linux菜鸟,学习了,感谢

论坛徽章:
0
8 [报告]
发表于 2009-05-13 10:12 |只看该作者
同学去看一下ip route的源码!!!!!!!!!!!1

http://developer.osdl.org/dev/iproute2/

论坛徽章:
0
9 [报告]
发表于 2009-05-14 10:10 |只看该作者
原帖由 skywalkerjj 于 2009-4-30 16:57 发表
现在可以成功添加一条路由上去,如何再完成添加网关呢?请大家帮帮忙,毕设要用,急~谢谢谢谢

你前面是添加一条主机路由,添加网段的话,目的地址要填成网段,再把FALG的主机标志去掉,不知道你问的是不是这个意思

参看busybox的route_main的实现。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP