| sunljh 回复于:2003-02-15 23:46:45
|
用system()哦
|
| YJS 回复于:2003-02-13 19:03:30
|
[quote:41e35d308c="tomken"] 高手们 谢谢了[/quote:41e35d308c]
系统提供一个route函数,你可以看看manual。
|
| tomken 回复于:2003-02-14 00:36:25
|
我没找到,能给个例程吗
|
| YJS 回复于:2003-02-14 08:43:05
|
[quote:c822f87580="tomken"]我没找到,能给个例程吗[/quote:c822f87580]
呵呵,FreeBSD下有route函数,Linux下没有这个函数,不过我想应该有其他的方法的。
|
| tomken 回复于:2003-02-14 09:29:34
|
不是有好多要当版吗,帮解决一下吧,我一定支持
还有各位高手们,我听说原始套接字可以,帮帮吧
5~~~~~
|
| YJS 回复于:2003-02-14 11:02:38
|
[quote:3e222c955b="tomken"]不是有好多要当版吗,帮解决一下吧,我一定支持
还有各位高手们,我听说原始套接字可以,帮帮吧
5~~~~~[/quote:3e222c955b]
ioctl()支持如下的参数(/usr/include/bits/ioctls.h):
/* Routing table calls. */
#define SIOCADDRT 0x890B /* add routing table entry */
#define SIOCDELRT 0x890C /* delete routing table entry */
#define SIOCRTMSG 0x890D /* call to routing system */
其中SIOCADDRT用于追加路由,SIOCDELRT用于删除路由。
原始套接口的实现方式在FreeBSD下是可以的,具体可以参考FreeBSD的源代码,路径:/usr/src/sbin/route/route.c。
|
| tomken 回复于:2003-02-14 14:47:33
|
谢谢 ,
google 了半天,没结果
给个例程, 不胜感激
|
| YJS 回复于:2003-02-14 14:51:24
|
[quote:7db56e8258="tomken"]谢谢 ,
google 了半天,没结果
给个例程, 不胜感激[/quote:7db56e8258]
最近比较忙,再说我这里一般用FreeBSD和SunOS,唯一的一台Linux我还没有root权限,呵呵!
自己动手写写吧,好像不是很难,遇到问题我们讨论。
oldhand@oldhand.org
|
| 无双 回复于:2003-02-14 15:43:04
|
route 的源码呢
所了吗
|
| tomken 回复于:2003-02-14 17:02:38
|
#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[] = "eth1";
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;
}
// 不成,给我看看吧,无双
|
| tomken 回复于:2003-02-14 17:44:57
|
我搞定了,
少了一句话
现在加下 在rt.flags 下面
my_addr->sin_family = AF_INET;
|
| tomken 回复于:2003-02-15 02:26:44
|
有了新的要求,在加前,我要查询有没有这条路由,如何查啊
|
| gadfly 回复于:2003-02-15 22:23:36
|
路由表可以从文件/proc/net/rt_cache中读出
|
| gadfly 回复于:2003-02-16 21:24:58
|
route,netstat的查找都是通过/proc/net/rt_cache的查找来实现的
|
| tomken 回复于:2003-02-16 18:52:52
|
查询用/proc/net/rt_cache 不好查吧,
用system() 一是不正规,二是效率不是很好吧
谢谢帮助,我还是想用C
|
| sunpk 回复于:2003-02-16 20:03:16
|
struct sockaddr_in * my_addr;
你为什么用指针?????????
|
| tomken 回复于:2003-02-16 20:07:03
|
拷贝的时间不用取地址了
没什么,不用也行
|
| sunpk 回复于:2003-02-16 20:12:36
|
感觉不是!!!
用指针有警告吗?
我现在没有 (!ms) !
|
| tomken 回复于:2003-02-16 20:57:53
|
在linux 上执行(RedHat 7.2)
gcc -o test test.c -Wall
没有
|
| liupch 回复于:2003-02-17 09:14:26
|
在FreeBSD里面可以使用sysctl得到已有的路由信息。
|
| tomken 回复于:2003-02-23 18:20:08
|
大家好,版主好,
我发现 linux 中的 route -n 显示的内容和
/proc/net/route
显示的内容有的时候不同,个数不同
唉
|
| 无双 回复于:2003-02-24 10:09:57
|
那使用sysctl呢
|
| tomken 回复于:2003-02-24 12:22:03
|
没用过,请赐教
|