在Linux中,可以使用C语言来获取网络接口(如ens)的IP地址。以下是一些常用的方法:
- 使用getifaddrs函数:通过调用getifaddrs函数,可以获取系统中所有网络接口的信息,包括IP地址。示例代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <ifaddrs.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main() {
struct ifaddrs *interfaces, *ifa;
if (getifaddrs(&interfaces) == -1) {
perror("getifaddrs");
return -1;
}
for (ifa = interfaces; ifa != NULL; ifa = ifa->ifa_next) {
if (ifa->ifa_addr == NULL || !(ifa->ifa_flags & IFF_UP))
continue;
// IPv4地址
if (ifa->ifa_addr->sa_family == AF_INET) {
struct sockaddr_in *addr = (struct sockaddr_in *)ifa->ifa_addr;
char ip[INET_ADDRSTRLEN];
inet_ntop(AF_INET, &(addr->sin_addr), ip, INET_ADDRSTRLEN);
printf("%s: %s\n", ifa->ifa_name, ip);
}
// IPv6地址
else if (ifa->ifa_addr->sa_family == AF_INET6) {
struct sockaddr_in6 *addr = (struct sockaddr_in6 *)ifa->ifa_addr;
char ip[INET6_ADDRSTRLEN];
inet_ntop(AF_INET6, &(addr->sin6_addr), ip, INET6_ADDRSTRLEN);
printf("%s: %s\n", ifa->ifa_name, ip);
}
}
freeifaddrs(interfaces);
return 0;
}
- 使用ioctl函数和SIOCGIFADDR标志:可以使用ioctl函数与SIOCGIFADDR标志来获取指定接口的IP地址。示例代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main() {
int fd;
struct ifreq ifr;
memset(&ifr, 0, sizeof(ifr));
strcpy(ifr.ifr_name, "ens");
fd = socket(AF_INET, SOCK_DGRAM, 0);
if (fd == -1) {
perror("socket");
return -1;
}
if (ioctl(fd, SIOCGIFADDR, &ifr) == -1) {
perror("ioctl");
close(fd);
return -1;
}
close(fd);
char ip[INET_ADDRSTRLEN];
struct sockaddr_in *addr = (struct sockaddr_in *)&(ifr.ifr_addr);
inet_ntop(AF_INET, &(addr->sin_addr), ip, INET_ADDRSTRLEN);
printf("IP address: %s\n", ip);
return 0;
}
请注意,上述代码中的”ens”需要替换为你要获取IP地址的网络接口名字(如”eth0”、”wlan0”等)。
内容由零声教学AI助手提供,问题来源于学员提问