1. 程式人生 > >linux獲取活動網絡卡ip地址

linux獲取活動網絡卡ip地址

1、根據ioctl機制列印當前所有網絡卡

程式碼:

#include <sys/ioctl.h>

#include <net/if.h>

#include <netinet/in.h>

#include <arpa/inet.h>

#include <string.h>

#include <stdio.h>

int get_local_ip(char *ip)

{

        int fd, intrface, retn = 0;

        struct ifreq buf[INET_ADDRSTRLEN];

        struct ifconf ifc;

        if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) >= 0)

        {

                ifc.ifc_len = sizeof(buf);

                // caddr_t,linux核心原始碼裡定義的:typedef void *caddr_t;

                ifc.ifc_buf = (caddr_t)buf;

                if (!ioctl(fd, SIOCGIFCONF, (char *)&ifc))

                {

                        intrface = ifc.ifc_len/sizeof(struct ifreq);

                        while (intrface-- > 0)

                        {

                                if (!(ioctl(fd, SIOCGIFADDR, (char *)&buf[intrface])))

                                {

                                        ip=(inet_ntoa(((struct sockaddr_in*)(&buf[intrface].ifr_addr))->sin_addr));

                                        printf("IP:%s\n", ip);

                                }

                        }

                }

        close(fd);

        return 0;

        }

}

int main()

{

        char ip[64];

        memset(ip, 0, sizeof(ip));

        get_local_ip(ip);

        return 0;

}

編譯:

[[email protected] get_ip]# gcc -Wall -g ip.c 

[[email protected] get_ip]# ./a.out 

IP:192.168.2.53

IP:192.168.2.55

IP:127.0.0.1

程式碼解析:

<netinet/in.h>中定義了 #define INET_ADDRSTRLEN 16

2、通過列舉網絡卡列印當前所有網絡卡

程式碼:

#include <stdio.h>

#include <ifaddrs.h>

#include <netinet/in.h>

#include <string.h>

#include <arpa/inet.h>

int get_local_ip(char *ip) {

        struct ifaddrs *ifAddrStruct;

        void *tmpAddrPtr=NULL;

        getifaddrs(&ifAddrStruct);

        while (ifAddrStruct != NULL) {

                if (ifAddrStruct->ifa_addr->sa_family==AF_INET) {

                        tmpAddrPtr=&((struct sockaddr_in *)ifAddrStruct->ifa_addr)->sin_addr;

                        inet_ntop(AF_INET, tmpAddrPtr, ip, INET_ADDRSTRLEN);

                        printf("%s IP Address:%s\n", ifAddrStruct->ifa_name, ip);

                }

                ifAddrStruct=ifAddrStruct->ifa_next;

        }

        //free ifaddrs

        freeifaddrs(ifAddrStruct);

        return 0;

}

int main()

{

        char ip[16];

        memset(ip, 0, sizeof(ip));

        get_local_ip(ip);

        return 0;

}

編譯:

[[email protected] get_ip]# gcc -Wall -g ip.c 

[[email protected] get_ip]# ./a.out 

lo IP Address:127.0.0.1

eth0 IP Address:192.168.2.55

eth1 IP Address:192.168.2.53

程式碼解析:

API介面可檢視man 7 netdevice

3、多網絡卡情況下,將所有IP地址以字串形式打印出,用逗號(“,”)隔開,形式如:“127.0.0.1,192.168.2.55,192.168.2.53”

程式碼:

#include <stdio.h>

#include <ifaddrs.h>

#include <netinet/in.h>

#include <string.h>

#include <arpa/inet.h>

int get_local_ip(char *ips) {

        struct ifaddrs *ifAddrStruct;

        void *tmpAddrPtr=NULL;

        char ip[INET_ADDRSTRLEN];

        int n = 0;

        getifaddrs(&ifAddrStruct);

        while (ifAddrStruct != NULL) {

                if (ifAddrStruct->ifa_addr->sa_family==AF_INET) {

                        tmpAddrPtr=&((struct sockaddr_in *)ifAddrStruct->ifa_addr)->sin_addr;

                        inet_ntop(AF_INET, tmpAddrPtr, ip, INET_ADDRSTRLEN);

                        printf("%s IP Address:%s\n", ifAddrStruct->ifa_name, ip);

                        if (n == 0){

                                strncat(ips, ip, INET_ADDRSTRLEN);

                        } else {

                                strncat(ips, ",", 1);

                                strncat(ips, ip, INET_ADDRSTRLEN);

                        }

                        n++;

                }

                ifAddrStruct=ifAddrStruct->ifa_next;

        }

        //free ifaddrs

        freeifaddrs(ifAddrStruct);

        return 0;

}

int main()

{

        char ip[64];

        memset(ip, 0, sizeof(ip));

        get_local_ip(ip);

        printf("IP:%s\n", ip);

        return 0;

}

編譯:

[[email protected] get_ip]# gcc -Wall -g ip.c 

[[email protected] get_ip]# ./a.out 

lo IP Address:127.0.0.1

eth0 IP Address:192.168.2.55

eth1 IP Address:192.168.2.53

IP:127.0.0.1,192.168.2.55,192.168.2.53

4、多網絡卡情況下,將多個ip地址放入字串陣列中(去掉"127.0.0.1"地址)

程式碼:

#include <stdio.h>

#include <ifaddrs.h>

#include <netinet/in.h>

#include <string.h>

#include <arpa/inet.h>

int get_local_ip(char *ip_list) {

        struct ifaddrs *ifAddrStruct;

        void *tmpAddrPtr;

        char ip[INET_ADDRSTRLEN];

        int n = 0;

        getifaddrs(&ifAddrStruct);

        while (ifAddrStruct != NULL) {

                if (ifAddrStruct->ifa_addr->sa_family==AF_INET) {

                        tmpAddrPtr=&((struct sockaddr_in *)ifAddrStruct->ifa_addr)->sin_addr;

                        inet_ntop(AF_INET, tmpAddrPtr, ip, INET_ADDRSTRLEN);

                        if (strcmp(ip, "127.0.0.1") != 0) {

//                              printf("%s IP Address:%s\n", ifAddrStruct->ifa_name, ip);

                                if (n == 0){

                                        memcpy(ip_list, ip, INET_ADDRSTRLEN);

                                } else {

                                        memcpy(ip_list+INET_ADDRSTRLEN, ip, INET_ADDRSTRLEN);

                                }

                                n++;

                        }

                }

                ifAddrStruct=ifAddrStruct->ifa_next;

        }

        //free ifaddrs

        freeifaddrs(ifAddrStruct);

        return n;

}

int main()

{

        char ip[3][INET_ADDRSTRLEN];

        memset(ip, 0, sizeof(ip));

        int n;

        for (n=get_local_ip(*ip); n>0; n--) {

                printf("IP:%s\n", ip[n-1]);

        }

        return 0;

}

編譯:

[[email protected] get_ip]# gcc -Wall -g ip.c 

[[email protected] get_ip]# ./a.out 

IP:192.168.2.53

IP:192.168.2.55

相關推薦

linux獲取活動ip地址

1、根據ioctl機制列印當前所有網絡卡 程式碼: #include <sys/ioctl.h> #include <net/if.h> #include <netinet/in.h> #include <arpa/inet.h> #include <

delphi 獲取IP地址列表和Mac地址

1、宣告windows系統的sendarp函式 function sendarp(ipaddr: ulong; temp: dword; ulmacaddr: pointer; ulmacaddrleng: pointer): Dword; StdCall;External

LINUX獲取IP地址和MAC地址,子掩碼程式參考

/* mode time:20120727 LINUX下獲取IP地址和MAC地址.程式相關結構體在程式後面。 列印網絡卡的ip地址 子網掩碼 廣播地址 mac地址 環境: [[email protected] temp]# uname -a Linux b

C#之獲取IP地址

有時候不想讀取配置檔案來進行網路監聽,預設把本級所有IP地址監聽一遍,這個時候就需要獲取本級所有IP地址。 如下: string name = Dns.GetHostName(); IPAddress[] ipadrlist = Dns.Get

ip addr add和ifconfig的區別看linuxip地址的結構

                今天一個老外在郵件列表上問了一個問題,就是ip addr add和ifconfig的區別,我給他進行了解答,可能因為英語不好吧,解答的很簡單,因此我還是要在這裡詳細說明一下。其實它們之間沒有什麼區別,只 是表述方式不同罷了。如果你非常理解網路協議的原理以及網路的分層架構那麼我想

python獲取IP地址

#!/usr/bin/env python # -*- coding: utf-8 -*- import socket import fcntl import struct def get_ip_address(ifname): s = sock

shell 獲取IP地址掩碼 預設閘道器 廣播地址 MAC地址

# IP地址 ifconfig eth0 | grep "inet addr:" | awk -F " " '{print $2}' | awk -F ":" '{print $2}' # 廣播地址 ifconfig eth0 | grep "inet addr:" |

linux配置IP地址命令詳細介紹及一些常用網路配置命令

Linux命令列下配置IP地址不像圖形介面下那麼方 便,完全需要我們手動配置,下面就給大家介紹幾種配置的方法: 即時生效(重啟後失效): ifconfig eth0 192.168.1.102 netmask 255.255.255.0  //新增IP地址 rout

socket 通過 ioctl獲取 設定 IP掩碼 本地廣播地址

參看 http://blog.chinaunix.net/uid-20692625-id-3172833.html 類別 Request 說明 資料型別 套  接  口 SIOCATMARK  SIOCSPGRP  SIOCGPGRP 是否位於帶外標

在安卓6.0(及以上)裝置上無法獲取無線MAC地址的解決方案

在安卓6.0以下的裝置上,通過WifiManager.getConnectionInfo().getMacAddress()即可獲取WLAN實體地址, 而在6.0及以上,以此方式獲取到的MAC地址為固定值02:00:00:00:00:00,而非真實值 解決方案 WlanMacAddressGetter.

linux下修改MAC地址

linux下可以通過ethtool工具來修改MAC地址,方法如下: 1、下載ethtool,下載tar.gz包,路徑如下: https://mirrors.edge.kernel.org/pub/software/network/ethtool/ 2、拷貝到linux機器,解壓:

linux中檢視mac地址

1. ifconfig -a 其中 HWaddr欄位就是mac地址2. cat /sys/class/net/eth0/address 檢視eth0的mac地址3. cat /proc/net/arp 檢視連線到本機的遠端ip的mac地址4. 程式中使用SIOCGIFHW

linux c/c++按規則獲取ip

linux c/c++按規則獲取網絡卡ip 輸出專案到雲或者輸出給外部客戶,會遇到伺服器多網絡卡多ip的情形,如果有多個應用都需要這個主機ip,而且多應用需要獲取相同的ip,此時可以約定一種規則來獲取相同的ip,比如: 獲得所有網絡卡名,然後對網絡卡名按從小到大排序,查詢最小

獲取指定對應的IP地址

1 #include <stdio.h> 2 #include <string.h> 3 #include <sys/socket.h> 4 #include <sys/types.h> 5 #include <sys/ioctl.h>

配置Linux的eth0設定IP地址以及啟動方式

// 進入網絡卡設定配置目錄 [[email protected] ~]# cd/etc/sysconfig/network-scripts/ // 選擇需要配置的網絡卡,用vi編輯器開啟 [[email protected]]#vi ifcfg-eth

一句話腳本系列之獲取eth0IP地址(或MAC地址)

引言 使用場景: 我使用的Linux伺服器上有多個網絡卡,有時候就需要在指令碼中使用到指定網絡卡的IP地址或MAC地址,那麼這個時候就有兩種做法,一是預先讀取網絡卡的IP地址或MAC地址,然後寫入到指令碼中;另外一種方法就是通過shell命令實時獲取指定網絡卡上的當前IP

linux環境下單配置多個IP地址

即時生效: ifconfig eth0 192.168.1.102 netmask 255.255.255.0 啟動生效: vim /etc/sysconfig/network-scripts/ifcfg-eth0 加入 IPADDR=192.168.1.102 NETMASK=255.255.255.0 修

linux下C語言獲取MAC地址

#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <sys/ioctl.h>#include <sys/socket.h&g

linux檢視裝置MAC和IP地址以及設定MAC ip的注意事項

1  檢視裝置的MAC和IPLinux/Unix作業系統熟悉的人都通常是用console命令控制檯來進行相應的操作。  Linux/Unix作業系統檢視網絡卡mac地址的方法可以通過以下命令獲得:1.ifconfig -a2.ip link show3.ip address

linux設定ip為靜態地址

修改 /etc/network/interfaces。 安裝一下格式編輯: auto eth0 iface eth0 inet static address 192.168.x.xxx netmask 255.255.255.0 gateway 192.168.x.x