确保使用了ifreq和ioctl()调用的结构,您可以获取所有接口信息:
手册页在这里Ifreq手册页
typedef struct{ char *iface; struct ether_addr hwa; struct in_addr ipa; struct in_addr bcast; struct in_addr nmask; u_short mtu; } ifcfg_t; int get_local_info(int rsock, ifcfg_t *ifcfg) { struct ifreq ifr; memset(&ifr, 0, sizeof(ifr)); strncpy(ifr.ifr_name, ifcfg->iface, IF_NAMESIZE); if((ioctl(rsock, SIOCGIFHWADDR, &ifr)) == -1){ perror("ioctl():"); return -1; } memcpy(&(ifcfg->hwa), &ifr.ifr_hwaddr.sa_data, 6); memset(&ifr, 0, sizeof(ifr)); strncpy(ifr.ifr_name, ifcfg->iface, IF_NAMESIZE); if((ioctl(rsock, SIOCGIFADDR, &ifr)) == -1){ perror("ioctl():"); return -1; } memcpy(&ifcfg->ipa, &(*(struct sockaddr_in *)&ifr.ifr_addr).sin_addr, 4); memset(&ifr, 0, sizeof(ifr)); strncpy(ifr.ifr_name, ifcfg->iface, IF_NAMESIZE); if((ioctl(rsock, SIOCGIFBRDADDR, &ifr)) == -1){ perror("ioctl():"); return -1; } memcpy(&ifcfg->bcast, &(*(struct sockaddr_in *)&ifr.ifr_broadaddr).sin_addr, 4); memset(&ifr, 0, sizeof(ifr)); strncpy(ifr.ifr_name, ifcfg->iface, IF_NAMESIZE); if((ioctl(rsock, SIOCGIFNETMASK, &ifr)) == -1){ perror("ioctl():"); return -1; } memcpy(&ifcfg->nmask.s_addr, &(*(struct sockaddr_in *)&ifr.ifr_netmask).sin_addr, 4); memset(&ifr, 0, sizeof(ifr)); strncpy(ifr.ifr_name, ifcfg->iface, IF_NAMESIZE); if((ioctl(rsock, SIOCGIFMTU, &ifr)) == -1){ perror("ioctl():"); return -1; } ifcfg->mtu = ifr.ifr_mtu; return 0; }快速编辑,此功能要求在调用接口之前已经分配了接口,如下所示:
strcpy(if_cfg->iface, iface)
确保先分配了内存,然后像这样调用
if((get_local_info(sock, if_cfg)) != 0){ printf("Unable to get network device infon"); return -1;}


