熟悉Linux命令行的童鞋都知道,ifconfig命令可以列出當(dāng)前機(jī)器所有網(wǎng)絡(luò)設(shè)備節(jié)點(diǎn)對(duì)應(yīng)的IP地址,如下示例所示;
編輯
我們?cè)趯?shí)際的編程代碼中,也需要通過代碼來獲取本地的IP地址,那么有沒有辦法,直接在代碼中調(diào)用【ifconfig】命令行來獲取本地的IP地址呢?
答案肯定是有的,本文將給你正確的答案,請(qǐng)按下面的示例代碼:
#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
代碼運(yùn)行測(cè)試:
因筆者的Linux環(huán)境只有eth0和lo這2個(gè)網(wǎng)絡(luò)設(shè)備節(jié)點(diǎn),沒有wlan0、ppp0這兩個(gè)網(wǎng)絡(luò)設(shè)備節(jié)點(diǎn),所以wlan0節(jié)點(diǎn)和ppp0這2個(gè)節(jié)點(diǎn)測(cè)試報(bào)錯(cuò)了,而eth0和lo可以得到正確的IP地址,與文章開頭的ifconfig輸出是保持一致的。
以上測(cè)試代碼是筆者在平時(shí)工作中積累的代碼,可直接用于生產(chǎn)環(huán)境。使用過程,若發(fā)現(xiàn)問題,歡迎隨時(shí)交流討論,互相提高。謝謝。
-
Linux
+關(guān)注
關(guān)注
87文章
11207瀏覽量
208721 -
命令
+關(guān)注
關(guān)注
5文章
676瀏覽量
21965 -
網(wǎng)絡(luò)編程
+關(guān)注
關(guān)注
0文章
68瀏覽量
10055
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論