ip addr show
或 ifconfig
来获取网卡的 IP 地址。在Linux操作系统中,获取网卡的IP地址是一项常见且重要的任务,通过C语言编程,可以使用系统调用和库函数来实现这一目标,以下是详细的步骤和示例代码:
使用`ioctl`函数获取网卡信息
ioctl
函数是Linux系统中用于设备控制的重要系统调用之一,可以通过它获取网络接口的各种信息,包括IP地址、MAC地址等,以下是一个使用ioctl
函数获取网卡信息的完整示例:
#include <stdio.h> #include <string.h> #include <net/if.h> #include <sys/ioctl.h> #include <arpa/inet.h> #include <errno.h> int getLocalInfo(void) { int fd; int interfaceNum = 0; struct ifreq buf[16]; struct ifconf ifc; struct ifreq ifrcopy; char mac[16] = {0}; char ip[32] = {0}; char broadAddr[32] = {0}; char subnetMask[32] = {0}; if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { perror("socket"); close(fd); return -1; } ifc.ifc_len = sizeof(buf); ifc.ifc_buf = (caddr_t)buf; if (!ioctl(fd, SIOCGIFCONF, (char *)&ifc)) { interfaceNum = ifc.ifc_len / sizeof(struct ifreq); printf("interface num = %dn", interfaceNum); while (interfaceNum-> 0) { printf("ndevice name: %sn", buf[interfaceNum].ifr_name); // ignore the interface that not up or not running ifrcopy = buf[interfaceNum]; if (ioctl(fd, SIOCGIFFLAGS, &ifrcopy)) { printf("ioctl: %s [%s:%d]n", strerror(errno), __FILE__, __LINE__); close(fd); return -1; } // get the mac of this interface if (!ioctl(fd, SIOCGIFHWADDR, (char *)(&buf[interfaceNum])) { memset(mac, 0, sizeof(mac)); snprintf(mac, sizeof(mac), "%02x%02x%02x%02x%02x%02x", (unsigned char)buf[interfaceNum].ifr_hwaddr.sa_data[0], (unsigned char)buf[interfaceNum].ifr_hwaddr.sa_data[1], (unsigned char)buf[interfaceNum].ifr_hwaddr.sa_data[2], (unsigned char)buf[interfaceNum].ifr_hwaddr.sa_data[3], (unsigned char)buf[interfaceNum].ifr_hwaddr.sa_data[4], (unsigned char)buf[interfaceNum].ifr_hwaddr.sa_data[5]); printf("device mac: %sn", mac); } else { printf("ioctl: %s [%s:%d]n", strerror(errno), __FILE__, __LINE__); close(fd); return -1; } // get the IP of this interface if (!ioctl(fd, SIOCGIFADDR, (char *)&buf[interfaceNum])) { snprintf(ip, sizeof(ip), "%s", (char *)inet_ntoa(((struct sockaddr_in *)&(buf[interfaceNum].ifr_addr))->sin_addr)); printf("device ip: %sn", ip); } else { printf("ioctl: %s [%s:%d]n", strerror(errno), __FILE__, __LINE__); close(fd); return -1; } } } else { printf("ioctl: %s [%s:%d]n", strerror(errno), __FILE__, __LINE__); close(fd); return -1; } close(fd); return 0; }
2. 使用getifaddrs
函数获取网卡信息
getifaddrs
函数可以获取所有网络接口的信息,并存储在链表中,以下是一个使用getifaddrs
函数获取网卡信息的完整示例:
#include <stdio.h> #include <string.h> #include <ifaddrs.h> #include <arpa/inet.h> #include <errno.h> int main() { struct ifaddrs *ifaddr, *ifa; int family, s; char host[NI_MAXHOST]; if (getifaddrs(&ifaddr) == -1) { perror("getifaddrs"); return -1; } for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) { if (ifa->ifa_addr == NULL) continue; family = ifa->ifa_addr->sa_family; if (family == AF_INET || family == AF_INET6) { s = getnameinfo(ifa->ifa_addr, (family == AF_INET) ? sizeof(struct sockaddr_in) : sizeof(struct sockaddr_in6), host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST); if (s != 0) { printf("getnameinfo() failed: %s ", gai_strerror(s)); break; } printf("%s ", host); } } freeifaddrs(ifaddr); return 0; }
使用`ip`命令获取网卡信息
虽然ip
命令通常在shell中使用,但也可以通过C语言调用系统命令来执行,以下是一个使用system
函数调用ip
命令获取网卡信息的示例:
#include <stdio.h> #include <stdlib.h> int main() { system("ip addr show"); return 0; }
方法均可用于获取Linux系统中网卡的IP地址和其他相关信息,选择哪种方法取决于具体的需求和使用场景:
ioctl
函数适合需要详细控制和高效性能的场景。
getifaddrs
函数提供了更高层次的API,使用起来更加方便。
ip
命令适用于简单的脚本或临时调试。
在选择方法时,应考虑程序的可移植性、性能要求以及开发和维护的便捷性。
原创文章,作者:未希,如若转载,请注明出处:https://www.kdun.com/ask/1488795.html
本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。
发表回复