c Linux获取网卡ip
- 行业动态
- 2025-02-26
- 1
ip a
或 ifconfig
命令来获取网卡的 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
其中<网卡名称>
替换为实际的网卡名称,如eth0
、wlan0
等。
示例输出:
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 "<网卡名称>"
其中<网卡名称>
替换为实际的网卡名称,如eth0
、wlan0
等。
示例输出:
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地址,用户可以根据自己的需求和实际情况选择合适的方法来获取所需的信息。