我想使用C程序来获取networking接口的IP是手动设置还是通过DHCP。
我试图使用下面的代码,它已经在Debian中工作,但它没有在OpenWrt中工作。 我想知道如何在OpenWrt中编写一个C程序。 我试图用这个:
#include <stdio.h> int main(void) { FILE *fp; char buffer[80]; fp=popen("cat /etc/network/interfaces |grep ^iface\\ br-lan | awk -F ' ' '{print $4}'","r"); fgets(buffer, sizeof(buffer), fp); printf("%s", buffer); pclose(fp); }
这个代码在Debian中工作,但是在OpenWrt中它不能正常工作,所以我想知道如何编写一个程序来获得相同的结果。
对于OpenWRT,您可以使用以下命令获取此类信息:
$uci get network.lan.proto
所以我把你放在你的问题的程序,我只改变用来获取信息的命令:
#include <stdio.h> <br> int main(void) { FILE *fp; char buffer[80]; fp=popen("uci get network.lan.proto","r"); fgets(buffer, sizeof(buffer), fp); printf("%s", buffer); pclose(fp); }
要查看OpenWRT中可用的所有网络接口,可以使用以下命令:
$uci show network
你可以通过使用libuci
避免在你的c中使用调用linux命令。 libuci
包含C函数来执行uci命令而不通过popen传递( popen
用于从shell执行外部命令)。
libuci默认存在于OpenWRT的开发环境中,不需要下载,不需要编译,也不需要在OpenWRT机器上安装
你可以用这种方式使用libuci
#include <uci.h> void main() { char path[]="network.lan.proto"; char buffer[80]; struct uci_ptr ptr; struct uci_context *c = uci_alloc_context(); if(!c) return; if ((uci_lookup_ptr(c, &ptr, path, true) != UCI_OK) || (ptr.o==NULL || ptr.o->v.string==NULL)) { uci_free_context(c); return; } if(ptr.flags & UCI_LOOKUP_COMPLETE) strcpy(buffer, ptr.o->v.string); uci_free_context(c); printf("%s\n", buffer); }
(未测试)
当你编译你的程序时,你必须在编译命令gcc
添加-luci
操作系统没有必要决定如何配置接口。 内核(例如GNU / Linux的Linux部分)没有决定,它不会(也不应该)在意,只是通过操作系统正在使用的任何配置系统得知哪个网络地址与哪个接口连接。 OpenWRT不是GNU,它的运行方式不同。
有AFAIK没有明确的方式。
读取interfaces文件只是一个提示:不能保证当前的安装来自那里。
如果有的话,你可以看看“询问”DBUS接口。 你可以检查一个dhclient进程正在运行。 您可以检查/ etc中指定不同发行版的网络设置的其他文件。
我认为最可靠的选择将是一个多层次的事情:检查一大堆提示来提出答案。
另一种选择是:发送一个DHCP检查数据包到DHCP服务器来验证地址..如果你没有得到答案,虽然可能是网络关闭了,但是当地址被分配了。