我想使用C程序来获取网络接口的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
您可以通过使用避免在c语言中调用linux命令libuci。的libuci含有C函数来执行不经由POPEN传递UCI命令(popen用于从外壳执行外部命令)。
libuci
popen
默认情况下,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); }
(未测试)
当您编译程序时,必须-luci在编译命令中添加gcc
-luci
gcc