熟悉Linux命令行的童鞋都知道,ifconfig命令可以列出当前机器所有网络设备节点对应的IP地址,如下示例所示;
编辑
我们在实际的编程代码中,也需要通过代码来获取本地的IP地址,那么有没有办法,直接在代码中调用【ifconfig】命令行来获取本地的IP地址呢?
答案肯定是有的,本文将给你正确的答案,请按下面的示例代码:
#include
#include
int shell_cmd_excute(const char *cmd, char *result, int size)
{
int ret;
FILE *fp = NULL;
fp = popen(cmd, "r");
if (!fp) {
perror("popen error: ");
ret = -1;
goto exit_entry;
}
ret = fread(result, 1, size, fp);
if (ret <= 0) {
perror("fread error: ");
ret = -2;
goto exit_entry;
}
if (ret > 1 && ret < size && (result[ret-1] == '\r' || result[ret-1] == '\n')) {
result[ret-1] = '\0';
}
ret = 0;
exit_entry:
if (fp) {
fclose(fp);
}
return ret;
}
int get_local_ip_by_ifconfig(const char *interface, char *ip, int size)
{
int ret;
char cmd[128];
snprintf(cmd, sizeof(cmd), "ifconfig %s | sed -nr 's/.*inet (addr:)?(([0-9]*\\.){3}[0-9]*).*/\\2/p'", interface);
printf("shell cmd: %s\n", cmd);
ret = shell_cmd_excute(cmd, ip, size);
return ret;
}
int main(int argc, const char **argv)
{
int ret;
const char *interface;
char local_ip[128];
if (argc < 2) {
printf("Error param input !\n");
printf("Usage: %s [interface]\n", argv[0]);
printf("[interface]: network logic interface, like eth0/ppp0/wlan0/lo ...\n");
exit(-1);
}
interface = argv[1];
ret = get_local_ip_by_ifconfig(interface, local_ip, sizeof(local_ip));
if (!ret) {
printf("Get local ip OK, ip = %s\n", local_ip);
} else {
printf("Get local ip FAIL !\n");
}
return ret;
}
代码编译:
gcc -o ifconfig_ip ifconfig_ip.c
代码运行测试:
因笔者的Linux环境只有eth0和lo这2个网络设备节点,没有wlan0、ppp0这两个网络设备节点,所以wlan0节点和ppp0这2个节点测试报错了,而eth0和lo可以得到正确的IP地址,与文章开头的ifconfig输出是保持一致的。
以上测试代码是笔者在平时工作中积累的代码,可直接用于生产环境。使用过程,若发现问题,欢迎随时交流讨论,互相提高。谢谢。
全部0条评论
快来发表一下你的评论吧 !