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 这个函数获取