Chinaunix

标题: 用C语言 实现 修改 LINUX网络参数 [打印本页]

作者: 寂寞游侠    时间: 2006-09-26 14:10
标题: 用C语言 实现 修改 LINUX网络参数
我想问一下 ,如果 用C语言 实现 修改 LINUX网络参数。
   比如修改  系统的  IP。NETMASK。DNS。网关 等等信息。
   用C编程实现,怎么实现。。

  我说下,我的思理
     1. 找LINUX源码中的ifconfig。然后挖出来。。
     2. 第二,打开/etc/sysconfig//networkk-scripts/ifcfg-eth0。按照要求 更改。,然后system("service network start")  /我的问题是。我不知道怎么去按照 要求 对文件进行 个更改
  
   知道的朋友 能不能指点下。。如果可以,给个 演示的 代码。感激不尽亚
     
还有。想搞的东西是 用C写CGI。完成一个B/S模式的 网络 管理的东西。。

thank you

[ 本帖最后由 寂寞游侠 于 2006-9-26 14:13 编辑 ]
作者: wuqing    时间: 2006-09-26 14:44
演示代码?
你是不是没有ifconfig.c和routeadd.c的源代码?

直接打包FreeBSD6.1下的 /src/sbin/ifconfig目录,连makefile都有

ifconfig.rar

65.63 KB, 下载次数: 107

ifconfig


作者: wuqing    时间: 2006-09-26 14:45
route的源代码
就是route add啊,route delete之类的
分析完毕给俺写个学习报告吧

route.rar

16.74 KB, 下载次数: 74

route


作者: 飞灰橙    时间: 2006-09-26 14:51
easy得很

  1. BOOL SetIP(const char *pcInterface, unsigned long ulIP, unsigned long ulNetmask)
  2. {
  3.         struct ifreq ifr;
  4.         int fd;
  5.         struct sockaddr_in *pAddr;

  6.         if (pcInterface == NULL)
  7.         {
  8.                 fprintf(stderr, "illegal call function SetGeneralIP!\n");
  9.                 return FALSE;
  10.         }

  11.         if ((fd = socket(AF_INET,SOCK_DGRAM,0)) < 0) return FALSE;
  12.         strcpy(ifr.ifr_name, pcInterface);

  13.         pAddr = (struct sockaddr_in *)&(ifr.ifr_addr);
  14.         bzero(pAddr, sizeof(struct sockaddr_in));
  15.         pAddr->sin_addr.s_addr = ulIP;
  16.         pAddr->sin_family = AF_INET;
  17.         if (ioctl(fd, SIOCSIFADDR, &ifr) < 0)
  18.         {
  19.                 close(fd);
  20.                 return FALSE;
  21.         }

  22.         pAddr = (struct sockaddr_in *)&(ifr.ifr_addr);
  23.         bzero(pAddr, sizeof(struct sockaddr_in));
  24.         pAddr->sin_addr.s_addr = ulNetmask;
  25.         pAddr->sin_family = AF_INET;
  26.         if (ioctl(fd, SIOCSIFNETMASK, &ifr) < 0)
  27.         {
  28.                 close(fd);
  29.                 return FALSE;
  30.         }

  31.         close(fd);
  32.         return TRUE;
  33. }
复制代码

作者: 寂寞游侠    时间: 2006-09-26 16:00
to  wuqing   看完后,肯定 发个 报告上来。

TO  飞灰橙   ,老大的 代码 信手沾来,艾。不知道我什么时间 水平能达到这一步阿。。

   老大的代码里面我有 几个地方不是很明白。
  const char *pcInterface  接口名称的参数。具体是指什么呢?艾 实在太菜

  
pAddr = (struct sockaddr_in *)&(ifr.ifr_addr);
        bzero(pAddr, sizeof(struct sockaddr_in));
        pAddr->sin_addr.s_addr = ulIP;
        pAddr->sin_family = AF_INET;
        if (ioctl(fd, SIOCSIFADDR, &ifr) < 0)
        {
                close(fd);
                return FALSE;
        }
这段代码。进行了IP和NETMASK 的赋值后。已经操作 系统的吗?对进行  配置了吗?

  估计大家都在 鄙视我,没办法。真的不会
作者: 寂寞游侠    时间: 2006-09-26 16:12
const char *pcInterface  接口名称的参数 是 指eth0  吧?
作者: wuqing    时间: 2006-09-26 16:21
是否Linux传入eth0,solaris下传入hme0, bge0,HP下传入lan0, lan1等等就可以奏效还有待测试

谁测试测试?
作者: 寂寞游侠    时间: 2006-09-26 16:33
上面的 代码。。 (ioctl(fd, SIOCSIFADDR, &ifr) < 0)  对 对系统进行设置吗?
作者: 飞灰橙    时间: 2006-09-26 16:36
原帖由 寂寞游侠 于 2006-9-26 16:33 发表
上面的 代码。。 (ioctl(fd, SIOCSIFADDR, &ifr) < 0)  对 对系统进行设置吗?


对系统进行设置,是指下次开机就变成这个IP了吗?
这个代码恐怕办不到。。
作者: 寂寞游侠    时间: 2006-09-26 16:44
不是的。不用重启。。直接 该IP。系统的IP就变了阿。

当然了。如果。退一步。重启 后。系统IP变了。那也可以的阿。

    老大的。这段代码实现了 什么功能呢?  我看的不太懂亚
作者: langue    时间: 2006-09-26 19:18
标题: 回复 4楼 飞灰橙 的帖子
回复 4楼 飞灰橙 的帖子
ioctl(2)的可移植性如何?
作者: langue    时间: 2006-09-26 19:19
还有,千万不要在ssh或者其他的remote shell下面更改网络参数……血的教训啊!
作者: safedead    时间: 2006-09-26 21:10
学习了
我对ioctl还有路由套接字一直都糊里糊涂
太麻烦就没有深入研究
又懒得看iproute2的源码


作者: lovesaka    时间: 2006-09-26 21:23
原帖由 飞灰橙 于 2006-9-26 14:51 发表
easy得很
[code]
BOOL SetIP(const char *pcInterface, unsigned long ulIP, unsigned long ulNetmask)
{
        struct ifreq ifr;
        int fd;
        struct sockaddr_in *pAddr;

        if (pcInterface == NULL)
        {
                 ...

ioctl还是真是出了名的垃圾桶函数
作者: 飞灰橙    时间: 2006-09-27 09:12
原帖由 langue 于 2006-9-26 19:18 发表
回复 4楼 飞灰橙 的帖子
ioctl(2)的可移植性如何?


ioctl哪有移植性,还不是看driver怎么帮你实现
作者: 寂寞游侠    时间: 2006-09-27 11:32
大家 都 偏 题了阿。

   帮助 搞定 我的问题亚。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2