现在的位置: 首页 > 综合 > 正文

关于linux 下获取本机网关 ip mac 子网掩码的代码

2013年10月12日 ⁄ 综合 ⁄ 共 1361字 ⁄ 字号 评论关闭
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 这个函数获取

抱歉!评论已关闭.