int get_gw(char *gw) { FILE *fp; char buf[1024]; char cmd[1024]; char *tmp; strcpy(cmd, "ip route"); fp = popen(cmd, "r"); if(NULL == fp) { perror("popen error"); return -1; } while(fgets(buf, sizeof(buf), fp) != NULL) { tmp =buf; while(*tmp && isspace(*tmp)) ++ tmp; if(strncmp(tmp, "default", strlen("default")) == 0) break; } sscanf(buf, "%*s%*s%s", gw); //过滤前面两个字符串 pclose(fp); return 0; }
gateway是通过 ip route命令获取
int get_mac_ip_mask(char *ifname,char *mac1,char *ip,char *mask) { int sock; struct ifreq ifr; unsigned char mac[6]; sock = socket(AF_INET,SOCK_STREAM,0); if(sock<0) { perror("socket error!\n"); return -1; } strcpy(ifr.ifr_name,ifname); if((ioctl(sock,SIOCGIFHWADDR,&ifr) )== 0) { memcpy(mac,ifr.ifr_hwaddr.sa_data,6); //printf("%s mac address is :%02X:%02X:%02X:%02X:%02X:%02X\n","eth0",mac[0],mac[1],mac[2],mac[3],mac[4],mac[5] ); sprintf(mac1,"%02X-%02X-%02X-%02X-%02X-%02X",mac[0],mac[1],mac[2],mac[3],mac[4],mac[5]); } else { perror("ioctl error!\n"); return -1; } if((ioctl(sock, SIOCGIFADDR, &ifr)) == 0) { sprintf(ip,"%.15s", inet_ntoa(((struct sockaddr_in*)&(ifr.ifr_addr))->sin_addr)); } else { perror("ioctl error!\n"); return -1; } if((ioctl( sock, SIOCGIFNETMASK, &ifr)) == 0) { //sprintf(ip,"%.15s", inet_ntoa(((struct sockaddr_in*)&(ifr.ifr_addr))->sin_addr)); sprintf(mask, "%.15s",inet_ntoa((( struct sockaddr_in * )&( ifr.ifr_netmask ))->sin_addr)); } else { perror("ioctl error!\n"); return -1; } close(sock); return 0; }
其中ifname 指的是哪个网口 eth0 。。eth1 之类 mac ip mask 都是通过ioctl 这个函数获取