当前位置:首页 > 行业动态 > 正文

c Linux获取网卡ip

在 Linux 中,可以使用 ip aifconfig 命令来获取网卡的 IP 地址。

在Linux系统中,获取网卡IP地址是一个常见的操作,尤其在网络配置、调试和系统管理中,下面将详细介绍几种常用的方法来获取网卡的IP地址,包括命令行工具的使用和一些编程接口的调用。

一、使用命令行工具

1、ifconfig命令

基本用法ifconfig是最常用的查看网络接口配置信息的命令之一,在终端中输入ifconfig,即可显示所有网络接口的信息,包括每个网卡的名称、IP地址、子网掩码、广播地址等。

示例输出

 eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
         inet 192.168.1.100 netmask 255.255.255.0 broadcast 192.168.1.255
         inet6 fe80::a00:27ff:fefc:66c3 prefixlen 64 scopeid 0x20<link>
         ether 08:00:27:fc:66:c3 txqueuelen 1000 (Ethernet)
         RX packets 17408 bytes 23429198 (22.3 MiB)
         RX errors 0 dropped 0 overruns 0 frame 0
         TX packets 5795 bytes 1080114 (1.0 MiB)
         TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

说明:在上面的输出中,eth0是网卡设备的名称,inet字段后面的192.168.1.100就是该网卡的IPv4地址,对于IPv6地址,则显示在inet6字段后面。

2、ip命令

基本用法ip命令是现代Linux系统中推荐使用的网络配置工具,功能更加强大和灵活,要获取网卡的IP地址,可以使用ip addr show命令。

示例输出

 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
         link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
         inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
         inet6 ::1/128 scope host
           valid_lft forever preferred_lft forever
     2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
         link/ether 08:00:27:fc:66:c3 brd ff:ff:ff:ff:ff:ff
         inet 192.168.1.100/24 brd 192.168.1.255 scope global dynamic enp0s3
           valid_lft 677sec preferred_lft 677sec
         inet6 fe80::a00:27ff:fefc:66c3/64 scope link
           valid_lft forever preferred_lft forever

说明:在上述输出中,enp0s3是网卡设备的名称(不同的系统可能有不同的命名方式),inet字段后面的192.168.1.100/24就是该网卡的IPv4地址及其子网掩码。

3、hostname命令

基本用法hostname -I命令用于显示主机的所有IP地址,包括每个网卡的IP地址,这个命令简单快捷,适用于快速获取主机的IP信息。

示例输出

 192.168.1.100

说明:输出结果直接显示了主机的IPv4地址,如果主机有多个网卡或多个IP地址,它们将以空格分隔显示。

4、nmcli命令

基本用法nmcli是NetworkManager的命令行工具,用于管理和配置网络连接,要获取特定网卡的IP地址,可以使用以下命令:

 nmcli device show <网卡名称> | grep IP4.ADDRESS

其中<网卡名称>替换为实际的网卡名称,如eth0wlan0等。

示例输出

 GENERAL.DEVICE:                         eth0
     GENERAL.TYPE:                          ethernet
     GENERAL.HWADDR:                         08:00:27:FC:66:C3
     GENERAL.MTU:                            1500
     GENERAL.STATE:                         100 (connected)
     GENERAL.CONNECTION:                    --
     GENERAL.CON-PATH:                       --
     GENERAL.METERED:                        yes (guessed)
     GENERAL.MD5SSUM:                        --
     GENERAL.CHECKSUM:                       --
     GENERAL.GUESSED-MAC:                    no
     GENERAL.AUTOCONNECT:                    yes
     IP4.ADDRESS[1]:                        192.168.1.100/24
     IP4.GATEWAY:                           192.168.1.254
     IP4.ROUTE[1]:                         dst = 192.168.1.0/24, nh = 00:00:00:00:00:00, wt = 600
     IP4.DNS[1]:                            --
     IP4.DOMAIN[1]:                         --
     IP4.DHCP4[1]:                         yes
     IP4.METHOD[1]:                         auto
     IP4.LLADDR[1]:                         fe80::a00:27ff:fefc:66c3/64
     IP4.GATEWAY[1]:                       192.168.1.254
     IP4.ROUTE[1]:                         dst = 192.168.1.0/24, nh = 00:00:00:00:00:00, wt = 600
     IP4.DNS[1]:                            --
     IP4.DOMAIN[1]:                         --
     IP4.DHCP4[1]:                         yes
     IP4.METHOD[1]:                         auto

说明:上述输出中,IP4.ADDRESS[1]字段后面的192.168.1.100/24就是指定网卡的IPv4地址。

5、ss命令

基本用法ss命令是一个功能强大的套接字统计工具,也可以用来显示网卡的IP地址,要获取所有正在监听的TCP连接的信息(包括IP地址),可以使用以下命令:

 ss -tln

或者获取特定网卡的IP地址,可以结合grep命令使用:

 ss -tln | grep "<网卡名称>"

其中<网卡名称>替换为实际的网卡名称,如eth0wlan0等。

示例输出

 State      Recv-Q Send-Q Local Address:Port        Peer Address:Port      
    LISTEN      0      128         192.168.1.100:80                 *:

说明:在上述输出中,Local Address字段中的192.168.1.100就是指定网卡的IPv4地址。

二、使用编程接口

除了命令行工具外,还可以通过编程接口来获取网卡的IP地址,以下是一些常用的编程接口和示例代码:

1、ioctl()函数

基本用法:在Linux下,可以通过ioctl()函数以及结构体struct ifreq和结构体struct ifconf来获取网络接口的各种信息,具体过程是先通过ioctl()获取本地所有接口的信息保存到ifconf结构中,再从其中取出每个ifreq表示的接口信息。

示例代码

 int get_localip(const char *eth_name, char *local_ip_addr) {
         int ret = -1;
         register int fd;
         struct ifreq ifr;
         if (local_ip_addr == NULL || eth_name == NULL) {
             return ret;
         }
         if ((fd=socket(AF_INET, SOCK_DGRAM, 0)) > 0) {
             strcpy(ifr.ifr_name, eth_name);
             if (!(ioctl(fd, SIOCGIFADDR, &ifr))) {
                 ret = 0;
                 strcpy(local_ip_addr, inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr));
             }
         if (fd > 0) {
             close(fd);
         }
         return ret;
     }

说明:上述代码中,首先创建了一个数据报套接字,然后通过ioctl()函数获取指定网卡(由eth_name指定)的IP地址,并将其转换为点分十进制字符串格式存储到local_ip_addr中,如果成功获取到IP地址,则返回0;否则返回-1

2、getsockname()函数

基本用法getsockname()函数用于获取一个已捆绑或已连接套接字的本地地址,如果一个套接字与INADDR_ANY捆绑(即可以用任意主机的地址),此时除非调用connect()accept()来连接,否则getsockname()将不会返回主机IP地址的任何信息。

示例代码

 int main(int argc, const char **argv) {
         int ret = -1;
         socklen_t len;
         char buf[30] = {0};
         struct sockaddr_in server_addr, local_addr;
         int fd = socket(AF_INET, SOCK_STREAM, 0);
         if (fd <= 0) {
             printf("fail to creat socket
");
             return -1;
         }
         memset(&server_addr, 0, sizeof(server_addr));
         server_addr.sin_family = AF_INET;
         server_addr.sin_port = htons(PORT);
         server_addr.sin_addr.s_addr = inet_addr(SERVER_IP);
         if(connect(fd, (struct sockaddr*)&server_addr, sizeof(server_addr))<0) {
             printf("connect error
");             return -1;
         }
         len = sizeof(local_addr);
         if (getsockname(fd, (struct sockaddr *)&local_addr, &len) == -1) {
             perror("getsockname");
             return -1;
         }
         printf("Local IP Address : %s
", inet_ntoa(local_addr.sin_addr));
         close(fd);
         return 0;
     }

说明:上述代码中,首先创建了一个流式套接字,并连接到指定的服务器地址,然后通过getsockname()函数获取本地套接字的地址信息,并将其转换为点分十进制字符串格式打印出来,最后关闭套接字并退出程序。

无论是通过命令行工具还是编程接口,都可以方便地获取Linux系统中网卡的IP地址,用户可以根据自己的需求和实际情况选择合适的方法来获取所需的信息。

0