獲取網路介面資訊——ioctl()函式與結構體struct ifreq、 struct ifconf
阿新 • • 發佈:2019-01-22
#include <sys/types.h> #include <sys/ioctl.h> #include <sys/socket.h> #include <net/if.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <netdb.h> #include <string.h> #include <fcntl.h> #include <string.h> #include <errno.h> typedef uint32_t uint32; #define MAX_IF 10 int main() { struct ifreq ifVec[MAX_IF];//用來儲存所有介面 int sock = -1; if ( (sock = socket( AF_INET, SOCK_DGRAM, 0 )) < 0 ) fprintf(stderr, "Error:%d, cannot open RAM;\n"); // get if vector struct ifconf ioIfConf; ioIfConf.ifc_buf = (void *)ifVec; ioIfConf.ifc_len = sizeof(ifVec); printf("Len:%d\n", ioIfConf.ifc_len); if (ioctl(sock, SIOCGIFCONF, &ioIfConf) < 0 )//獲取所有網路介面資訊 fprintf(stderr, "Error:%d ioctl IFCONF\n"); printf("Len:%d\n", ioIfConf.ifc_len);// 和前面到len對比,發現ioctl修改裡len到大小 //迴圈列印每個網路介面到資訊 { struct ifreq *ifPt; struct ifreq *ifEndPt; ifPt = ifVec; ifEndPt = (void *)((char *)ifVec + ioIfConf.ifc_len); for (ifPt = ifVec; ifPt < ifEndPt; ifPt++) { struct ifreq ifReq; if ( ifPt->ifr_addr.sa_family != AF_INET ) { continue; } // Temp keepers of interface params... uint32 u32_addr, u32_mask; /* 列印ip地址 */ char ipDotBuf[16], subnetDotBuf[16], maskDotBuf[16]; // 儲存點分十進位制到ip地址 u32_addr = ((struct sockaddr_in *)&ifPt->ifr_addr)->sin_addr.s_addr; inet_ntop(AF_INET, &u32_addr, ipDotBuf, (socklen_t )sizeof(ipDotBuf)); printf("IP Address: %s\n", ipDotBuf); /* 列印地址掩碼 */ bzero(&ifReq,sizeof(struct ifreq)); memcpy(ifReq.ifr_name, ifPt->ifr_name, sizeof(ifReq.ifr_name)); if (ioctl(sock, SIOCGIFNETMASK, &ifReq ) < 0){ fprintf(stderr, "Error: %d, cannot get mask\n", errno); } else{ u32_mask = ((struct sockaddr_in *)&ifReq.ifr_addr)->sin_addr.s_addr; inet_ntop(AF_INET, &u32_mask, maskDotBuf, (socklen_t )sizeof(maskDotBuf)); printf("Mask: %s\n", maskDotBuf); } /* 列印MTU */ bzero(&ifReq,sizeof(struct ifreq)); memcpy(ifReq.ifr_name, ifPt->ifr_name, sizeof(ifReq.ifr_name)); if (ioctl(sock, SIOCGIFMTU, &ifReq ) < 0){ fprintf(stderr, "Error: %d, cannot get MTU\n", errno); } else{ printf("SIOCGIFMTU:%d\n", ifReq.ifr_mtu); } /* 其他資訊的列印方式與掩碼和MTU相同 */ } } }