Linux下C++程序如何修改系统IP?

jinmeibj 2014-11-19 06:51:14
项目是用C++做的,需要修改系统IP,本以为这种很通用的功能已经有成熟的方法了,没想到被卡住了。

系统版本是 NeoKylin 3.2.2(Carambola)x86_64
内核版本是 Linux 2.6.32-220.2.1.2.ky3.2.x86_64

需求:
1、在我们的界面上列出系统中所有的网卡和网卡上已有的地址(IP和掩码);
2、用户在我们的界面上选一个网卡,添加一个新的地址,或者替换一个已有地址(程序需要删除已有的IP地址);
3、程序执行修改,修改立刻生效,系统重启后修改不能消失。

如果通过 shell 中 的 ifconfig、ip addr命令,或者系统API ioctl(),系统重启后修改就消失了。用户可能在我们的界面上反复的改来改去,所以也不想在系统启动时执行一堆的添加、删除IP命令。

现在我们的做法是通过C++代码修改 /etc/sysconfig/network-scripts/ifcfg-eth* 文件,但是也有问题:
1、有时ifcfg-eth* 文件不存在
系统图形界面的右下角提供一个网络连接的配置工具,可以编辑连接。在该工具的界面中去掉一个连接的“对所有用户可用”选项后,network-scripts 目录下就没有 ifcfg-eth* 文件了,满硬盘也没找到被藏到哪里去了。我就这样被坑了。。。
2、有时ifcfg-eth* 文件有多个
还是用上边的工具,对一个网卡可以添加多个连接,然后只启用一个连接。这样,一个网卡就有多个ifcfg-eth* 文件,还不知道当前使用的是哪个文件,这些文件中可能有相同的IP。又被坑了。。。
3、ifcfg-eth* 文件名多种多样
谁说文件名只有ifcfg-eth0、ifcfg-eth1?还对应第0块网卡,第1块网卡。。。
实际的文件名有:ifcfg-eth0、ifcfg-System_eth0、ifcfg-有线连接_1。这么丰富的文件名,要与eth0、eth1对应起来,又又被坑。。。

难道这个很通用的功能,就没有标准的实现方式吗?

手里只有30分了,各位见谅。
...全文
1028 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Watcher2016 2015-02-05
  • 打赏
  • 举报
回复
对于 系统中nmcli没有提供设置IP的功能,楼主现在有什么好的解决方法吗? 我遇到的主要是第三个问题,系统重启后,以前设置的IP地址失效。
jinmeibj 2014-12-22
  • 打赏
  • 举报
回复
前一阵出差了,结贴晚了,抱歉。 客户系统的nmcli没有提供设置IP的功能,最新版本已经提供了,无奈。
jinmeibj 2014-11-24
  • 打赏
  • 举报
回复
有进展了,界面右下角的小工具原来是“NetworkManager”,是个开源项目,其提供了shell的客户程序接口:“nmcli”。直接调用它可以得到当前连接的UUID,这样可以解决最开始所说的第2、3个问题了。至于第1个问题,实在不行只能看它的源码了。
williamhong 2014-11-24
  • 打赏
  • 举报
回复
可以参考系统启动脚本怎么初始化IP的的,不同系统可能有差异
vinllen 2014-11-21
  • 打赏
  • 举报
回复
选择网卡应该是可以选得,好像是用ioctl,我以前也想这么搞,后来懒得折腾就直接在下拉菜单中定义好eth0,eth1,wlan0等常用网卡,用户选定后再去系统中匹配。

    struct ifreq ifr;
    inet_sock = socket(AF_INET, SOCK_DGRAM, 0);
    strcpy(ifr.ifr_name, name.c_str());//更改为下拉选择网卡 name为用户选择地网卡

    if(ioctl(inet_sock, SIOCGIFADDR, &ifr) < 0) {
        errorCall(this, "网卡绑IP失败!"); //表示没有该张网卡
        return ;    
    }

    std::string tmp = inet_ntoa(((struct sockaddr_in*)&(ifr.ifr_addr))->sin_addr); //获取网卡的ip
替换ip命令的话可以试试直接调用shell的ip addr命令,前提你不是非要用C++实现
jinmeibj 2014-11-21
  • 打赏
  • 举报
回复
引用 1 楼 u011353822 的回复:
ip一般是由dhcp设置的,每次开机都会动态分配ip,如果想生效固化ip,需要设置dhcp
我们的程序运行时,主机IP地址不是由DHCP服务器分配的,而是在网卡上直接指定静态IP。我们的程序就是想修改这个静态IP,但没有找到很好的修改方法。
jinmeibj 2014-11-21
  • 打赏
  • 举报
回复
谢谢“u011353822”的回答,但还没有解决问题。 获取系统的网卡和IP是可以的,我们已经通过getifaddrs()实现了,关键是如何修改系统IP。ioctl() 和 ip addr 都试过,他们添加的都是虚拟IP,系统重启后就没有了。 如果能够通过shell实现也可以,我们的程序已经有几处调用shell的地方了。 关键是如何修改系统IP,系统重启后不消失。考虑过系统启动时执行ip addr等命令,但用户在我们的界面中反复修改IP后,这种方式就不适合了。
vinllen 2014-11-19
  • 打赏
  • 举报
回复
ip一般是由dhcp设置的,每次开机都会动态分配ip,如果想生效固化ip,需要设置dhcp

23,120

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧