#include <stdio.h> //printf() #include <unistd.h> //ioctl() #include <sys/ioctl.h> //ioctl #include <sys/socket.h> //socket() #include <net/if.h> //struct ifconf{} & struct ifreq{} #include <string.h> //strcpy() #include <arpa/inet.h> //inet_ntoa() #include <stdlib.h> //malloc() & free() int print_if_addr(int fd, char *interface_name); int print_if_mac(int fd, char *interface_name); int print_if_broadaddr(int fd, char *interface_name); int print_if_mask(int fd, char *interface_name); int print_if_mtu(int fd, char *interface_name); int print_all_interface(); int print_if_addr6(char *interface_name); int print_interface_info(char *interface_name); int set_if_up(char *interface_name); int set_if_down(char *interface_name); int set_if_ip(char *interface_name, char *ip_str); void usage(); int main(int argc, char **argv) { int sockfd; printf("/n **********funway:用ioctl函数来实现ifconfig命令的效果**********/n"); switch(argc) { case 1: print_all_interface(); break; case 2: print_interface_info(argv[1]); break; case 3: if(strcmp(argv[2], "up") == 0) set_if_up(argv[1]); else if(strcmp(argv[2], "down") == 0) set_if_down(argv[1]); else set_if_ip(argv[1], argv[2]); break; default: usage(); break; } return 0; } void usage() { printf("usage: ./myifconfig [interface [down|up|ip]]/n"); } int print_if_addr(int fd, char *if_name) { struct sockaddr_in *ip; struct ifreq ifr; strcpy(ifr.ifr_name, if_name); if(ioctl(fd, SIOCGIFADDR, &ifr) < 0) { perror("ioctl SIOCGIFADDR error"); return -1; } ip = (struct sockaddr_in *)&ifr.ifr_addr; printf(" IP: %s/n", inet_ntoa(ip->sin_addr)); return 0; } int print_if_broadaddr(int fd, char *if_name) { struct sockaddr_in *ip; struct ifreq ifr; strcpy(ifr.ifr_name, if_name); if(ioctl(fd, SIOCGIFBRDADDR, &ifr) < 0) { perror("ioctl SIOCGIFBRDADDR error"); return -1; } ip = (struct sockaddr_in *)&ifr.ifr_broadaddr; printf(" Broadcast: %s/n", inet_ntoa(ip->sin_addr)); return 0; } int print_if_mask(int fd, char *if_name) { struct sockaddr_in *ip; struct ifreq ifr; strcpy(ifr.ifr_name, if_name); if(ioctl(fd, SIOCGIFNETMASK, &ifr) < 0) { perror("ioctl SIOCGIFNETMASK error"); return -1; } ip = (struct sockaddr_in *)&ifr.ifr_ifru.ifru_netmask; printf(" Mask: %s/n", inet_ntoa(ip->sin_addr)); return 0; } int print_if_mac(int fd, char *if_name) { unsigned char *p; struct ifreq ifr; strcpy(ifr.ifr_name, if_name); if(ioctl(fd, SIOCGIFHWADDR, &ifr) < 0) { perror("ioctl SIOCGIFHWADDR error"); return -1; } p = (char *)&ifr.ifr_ifru.ifru_hwaddr.sa_data[0]; printf(" MAC: x:x:x:x:x:x/n", *p, *(p+1), *(p+2), *(p+3), *(p+4), *(p+5)); return 0; } int print_if_mtu(int fd, char *if_name) { unsigned int mtu; struct ifreq ifr; strcpy(ifr.ifr_name, if_name); if(ioctl(fd, SIOCGIFMTU, &ifr) < 0) { perror("ioctl SIOCGIFMTU error"); return -1; } mtu = ifr.ifr_ifru.ifru_mtu; printf(" MTU: %d/n", mtu); return 0; } int print_if_addr6(char *if_name) { unsigned int mtu; struct ifreq ifr; int sockfd; if((sockfd = socket(AF_INET6, SOCK_DGRAM, 0)) < 0) { perror("Socket error"); return -1; } return 0; } int print_all_interface() { struct ifconf ifc; struct ifreq *ifr_p; int sockfd, len, old_len = 0, i; char *buf; if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { perror("Socket error"); return -1; } len = 10 * sizeof(struct ifreq); for( ; ; ) { if((buf = malloc(len)) == NULL) { perror("malloc error"); return -1; } ifc.ifc_len = len; ifc.ifc_buf = buf; if(ioctl(sockfd, SIOCGIFCONF, &ifc) < 0) { perror("ioctl SIOCGIFCONF error"); return -1; } if(ifc.ifc_len == old_len) break; old_len = ifc.ifc_len; len += 10 * sizeof(struct ifreq); free(buf); } printf("we have %d interfaces/n", ifc.ifc_len / sizeof(struct ifreq)); for(i = 0; i < ifc.ifc_len / sizeof(struct ifreq); i++) { ifr_p = &ifc.ifc_req[i]; printf("/ninterface [%s]:/n", ifr_p->ifr_name); print_if_addr(sockfd, ifr_p->ifr_name); print_if_broadaddr(sockfd, ifr_p->ifr_name); print_if_mask(sockfd, ifr_p->ifr_name); print_if_mac(sockfd, ifr_p->ifr_name); print_if_mtu(sockfd, ifr_p->ifr_name); } close(sockfd); return 0; } int print_interface_info(char *if_name) { int sockfd; if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { perror("Socket error"); return -1; } printf("%s:/n", if_name); print_if_addr(sockfd, if_name); print_if_broadaddr(sockfd, if_name); print_if_mask(sockfd, if_name); print_if_mac(sockfd, if_name); print_if_mtu(sockfd, if_name); close(sockfd); return 0; } int set_if_up(char *if_name) { struct ifreq ifr; int sockfd; if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { perror("Socket error"); return -1; } strcpy(ifr.ifr_name, if_name); if(ioctl(sockfd, SIOCGIFFLAGS, &ifr) < 0) { perror("ioctl SIOCGIFFLAGS error"); return -1; } ifr.ifr_flags |= IFF_UP; if(ioctl(sockfd, SIOCSIFFLAGS, &ifr) < 0) { perror("ioctl SIOCSIFFLAGS error"); return -1; } return 0; } int set_if_down(char *if_name) { struct ifreq ifr; int sockfd; if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { perror("Socket error"); return -1; } strcpy(ifr.ifr_name, if_name); if(ioctl(sockfd, SIOCGIFFLAGS, &ifr) < 0) { perror("ioctl SIOCGIFFLAGS error"); return -1; } ifr.ifr_flags &= ~IFF_UP; if(ioctl(sockfd, SIOCSIFFLAGS, &ifr) < 0) { perror("ioctl SIOCSIFFLAGS error"); return -1; } return 0; } int set_if_ip(char *if_name, char *ip_str) { struct ifreq ifr; struct sockaddr_in ip_addr; int sockfd; if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { perror("Socket error"); return -1; } ip_addr.sin_family = AF_INET; if(inet_pton(AF_INET, ip_str, &ip_addr.sin_addr) < 1) { perror("error ipv4 addr:"); return -1; } strcpy(ifr.ifr_name, if_name); memcpy(&ifr.ifr_addr, &ip_addr, sizeof(struct sockaddr_in)); if(ioctl(sockfd, SIOCSIFADDR, &ifr) < 0) { perror("ioctl SIOCSIFADDR error"); return -1; } return 0; }
注:有线连接mac接口名:eth0
无线连接MAC接口名:wlan0
转载请注明原文地址: https://www.6miu.com/read-36940.html