Linux下获取系统的IP,子网掩码,网关,MAC和配置文件的修改

http://blog.csdn.net/tianmohust/article/details/6533301

一 获取Linux平台下的配置参数,如IP,子网掩码,GateWay和Mac地址

  1. int GetComputerInfo(char *ip,char *zwym,char*brdaddr,char *mac)  
  2. {  
  3.     /*socket参数设置*/  
  4.     int sock; struct sockaddr_in sin; struct ifreq ifr;  
  5.     sock = socket(AF_INET, SOCK_DGRAM, 0);  
  6.     if (sock == -1)  
  7.     {  
  8.         perror("socket");  
  9.         return -1;       
  10.     }    
  11.   
  12.     /*这个是网卡的标识符*/  
  13.     strncpy(ifr.ifr_name, "eth0", IFNAMSIZ);  
  14.     ifr.ifr_name[IFNAMSIZ - 1] = 0;   
  15.      
  16.     /*开辟用于保存即将获取参数的空间*/  
  17.     ip = (char*)malloc(sizeof(inet_ntoa(sin.sin_addr)));  
  18.     zwym = (char*)malloc(sizeof(inet_ntoa(sin.sin_addr)));  
  19.     mac = (char*)malloc(sizeof(inet_ntoa(sin.sin_addr)));  
  20.     brdaddr = (char*)malloc(sizeof(inet_ntoa(sin.sin_addr)));   
  21.       
  22.     /*获取ip*/  
  23.     if (ioctl(sock, SIOCGIFADDR, &ifr) < 0)   
  24.     {  
  25.         perror("ioctl");  
  26.         return -1;  
  27.     }  
  28.     memcpy(&sin, &ifr.ifr_addr, sizeof(sin));  
  29.     sprintf(ip,"%s/n",inet_ntoa(sin.sin_addr));    
  30.       
  31.     /*获取子网掩码*/  
  32.     if (ioctl(sock, SIOCGIFNETMASK, &ifr)< 0)   
  33.     {  
  34.         perror("ioctl");  
  35.         return -1;  
  36.     }  
  37.     memcpy(&sin, &ifr.ifr_addr, sizeof(sin));    
  38.     sprintf(zwym,"%s/n",inet_ntoa(sin.sin_addr));  
  39.       
  40.     /*获取网关*/                 
  41.     ioctl(sock,SIOCGIFBRDADDR,&ifr);  
  42.     memcpy(&sin, &ifr.ifr_addr, sizeof(sin));  
  43.     sprintf(brdaddr,"%s/n",inet_ntoa(sin.sin_addr));   
  44.       
  45.     /*获取mac*/  
  46.     if (ioctl(sock, SIOCGIFHWADDR, &ifr)< 0)  
  47.     {          
  48.         perror("ioctl");  
  49.         return -1;  
  50.     }  
  51.     memcpy(&sin, &ifr.ifr_addr, sizeof(sin));   
  52.     sprintf(mac,"%s/n",inet_ntoa(sin.sin_addr));  
  53.       
  54.     return 0;  
  55. }  

附录:

  1. int main()  
  2. {  
  3.     int sfd;  
  4.     struct ifconf interface;  
  5.     struct ifreq ifreq1;  
  6.     struct sockaddr_in* addr = NULL;  
  7.     unsigned char mac[6];  
  8.     unsigned char ip[4];  
  9.     unsigned char brdaddr[4];  
  10.     unsigned char netmask[4],netmask1[4];  
  11.     struct in_addr myip;  
  12.     sfd = socket(PF_INET,SOCK_DGRAM,0);  
  13.   
  14.   
  15.     strcpy(ifreq1.ifr_name,"eth0");//eth0位网卡名,也可搜索得到本地网卡名称  
  16.     ioctl(sfd,SIOCGIFHWADDR,&ifreq1);  
  17.   
  18.     memcpy(mac,ifreq1.ifr_hwaddr.sa_data,6);  
  19.     ioctl(sfd,SIOCGIFADDR,&ifreq1);  
  20.   
  21.     addr = (struct sockaddr_in*)&ifreq1.ifr_addr;  
  22.   
  23.     //printf("%x/n", addr->sin_addr.s_addr);  
  24.     *(u_int32_t *)ip = addr -> sin_addr.s_addr;  
  25.     ioctl(sfd,SIOCGIFBRDADDR,&ifreq1);  
  26.     *(u_int32_t *)brdaddr = addr -> sin_addr.s_addr;  
  27.   
  28.     ioctl(sfd,SIOCGIFNETMASK,&ifreq1);  
  29.     *(u_int32_t *)netmask = addr -> sin_addr.s_addr;   
  30.   
  31.     printf("MAC:%02X:%02X:%02X:%02X:%02X:%02X/n",mac[0],mac[1],mac[2],mac[3],mac[4],mac[5]);  
  32.     printf("IP ADDR:%d.%d.%d.%d/n",ip[0],ip[1],ip[2],ip[3]);  
  33.     printf("GATEWAY:%d.%d.%d.%d/n",brdaddr[0],brdaddr[1],brdaddr[2],brdaddr[3]);  
  34.     printf("NETMASK:%d.%d.%d.%d/n",netmask[0],netmask[1],netmask[2],netmask[3]);  
  35.   
  36.     return 0;  
  37. }  

二 修改Linux系统配置文件的参数

  1. void SaveInfo(char*filename,struct node *head)   
  2. {  
  3.     FILE* fp; /*文件指针*/  
  4.     struct  node *p; /*数据链表头*/  
  5.     int flag=1, count=0;  /*flag为是否保存成功标志,count为保存数据数目*/        
  6.     fp = fopen(filename,"w");  /*为输出打开一个二进制的文件*/  
  7.   
  8.     if(fp == NULL)   
  9.     {           
  10.         printf("\n=====>提示:重新打开文件时发生错误!\n");                      
  11.         exit(1);  
  12.     }  
  13.   
  14.     /*将p连接在head的后面*/  
  15.     p = head;  
  16.   
  17.     /*判断p是否为空,以便进行循环*/  
  18.     while(p)  
  19.     {  
  20.         /*把p中的内容写到fp中*/  
  21.         if(fwrite(p,sizeof(struct node) – 4 , 1, fp) == 1)   
  22.         {  
  23.             p=p->next; /*p向后移动一*/  
  24.             count++;/*用于统计保存书籍记录的数目*/  
  25.         }  
  26.         /*如果fwrite(p,sizeof(struct book),1,fp)返回值不是一,提前跳出循环*/  
  27.         else   
  28.         {   
  29.             flag=0;                          
  30.             break;  
  31.         }  
  32.     }  
  33.   
  34.     if(flag == 1)  
  35.     {  
  36.            printf("\n=====>提示:文件保存成功.(有%d条记录已经保存).\n",count);   
  37.     }    
  38.       
  39.     fclose(fp); //关闭fp文件   
  40. }  
  41.   
  42. int  ModifyInfo(char *ip_addr,char*netmask_addr,char*brdaddr_addr,char*mac_addr)  
  43. {   
  44.     /*配置文件里面的9条数据,处理模式*/  
  45.     struct node *head,*p[9];  
  46.    
  47.     /*配置文件的路径*/  
  48.     char *filename = "/etc/sysconfig/network-scripts/ifcfg-eth0";  
  49.    
  50.     /*为保存配置文件相关数据开辟空间*/  
  51.     int i;  
  52.     for(i= 0;i < 9 ;i ++)  
  53.     {  
  54.         p[i] = (node *)malloc(sizeof(node));  
  55.     }  
  56.         
  57.     /*把配置文件数据,做成链表,头存放在head里面*/  
  58.     head = p[0];  
  59.    
  60.     /*即将要处理的配置文件*/  
  61.     memset(p[0]->name, 0, N);  
  62.     strcpy(p[0]->name  , "#  Advanced Micro Devices[AMD");//28  
  63.     memset(p[0]->value, 0, N);  
  64.     strcpy(p[0]->value , "]   79c970 [PCnet32 LANCE    ");//28  
  65.     memset(p[1]->name, 0, N);  
  66.     strcpy(p[1]->name  , "\nDEVICE=                    ");  
  67.     memset(p[1]->value, 0, N);  
  68.     strcpy(p[1]->value,  "eth0                         ");  
  69.     memset(p[2]->name, 0, N);  
  70.     strcpy(p[2]->name ,  "\nBOOTPROT=                  ");  
  71.     memset(p[2]->value, 0, N);  
  72.     strcpy(p[2]->value , "static                       ");  
  73.     memset(p[7]->name, 0, N);  
  74.     strcpy(p[7]->name ,  "\nONBOOT=                    ");  
  75.     memset(p[7]->value, 0, N);  
  76.     strcpy(p[7]->value,  "yes                          ");  
  77.     memset(p[8]->name, 0, N);  
  78.     strcpy(p[8]->name ,  "\nTYPE=                      ");  
  79.     memset(p[8]->value, 0, N);  
  80.     strcpy(p[8]->value, "Ethernet                     ");  
  81.       
  82.     /*修改的IP,子网掩码,网关和MAC*/  
  83.    
  84.     /*IP*/  
  85.     memset(p[3]->name, 0, N);  
  86.     strcpy(p[3]->name , "\nIPADDR=");      
  87.     for(i = 8;i < N ;i ++)  
  88.         p[3]->name[i] = ' ';  
  89.     memset(p[3]->value, 0, N);  
  90.     for( i = 0; ip_addr[i] != '\0'; i ++)  
  91.         p[3]->value[i] = ip_addr[i];  
  92.     for(j = i;j < N;j ++)  
  93.         p[3]->value[j] = ' ';  
  94.       
  95.     /*子网掩码*/  
  96.     memset(p[4]->name,0,N);  
  97.     strcpy(p[4]->name ,"\nNETMASK=");  
  98.     for(i = 9; i < N; i ++)  
  99.         p[4]->name[i] = ' ';  
  100.   
  101.     memset(p[4]->value,0,N);  
  102.     for( i = 0; netmask_addr[i] != '\0'; i ++)  
  103.         p[4]->value[i] = netmask_addr[i];  
  104.     for(j = i;j < N; j ++)  
  105.        p[4]->value[j] = ' ';      
  106.    
  107.     /*网关*/  
  108.     memset(p[5]->name, 0, N);  
  109.     strcpy(p[5]->name , "\nGATEWAY=");  
  110.     for(i = 9; i < N; i ++)  
  111.         p[5]->name[i] = ' ';  
  112.     memset(p[5]->value, 0, N);  
  113.     for( i = 0; brdaddr_addr[i] != '\0'; i ++)  
  114.         p[5]->value[i] = brdaddr_addr[i];  
  115.     for(j = i;j < N; j ++)  
  116.         p[5]->value[j] = ' ';  
  117.   
  118.     /*MAC*/  
  119.     memset(p[6]->name, 0, N);  
  120.     strcpy(p[6]->name , "\nHWADDR=");  
  121.     for(i = 8; i < N; i ++)  
  122.         p[6]->name[i] = ' ';  
  123.     memset(p[6]->value, 0, N);  
  124.     for(i = 0; mac_addr[i] != '\0'; i ++)  
  125.         p[6]->value[i] = mac_addr[i];  
  126.     for(j = i; j < N; j ++)  
  127.         p[6]->value[j] = ' ';   
  128.    
  129.     /*把数据做成链表连接起来*/  
  130.     p[0]->next = p[1];  
  131.     p[1]->next = p[2];p[2]->next = p[3];p[3]->next = p[4];p[4]->next = p[5];  
  132.     p[5]->next = p[6];p[6]->next = p[7];p[7]->next = p[8];p[8]->next = NULL;  
  133.    
  134.     /*保存配置文件*/  
  135.     SaveInfo(filename,head);  
  136.    
  137.     /*成功则返回1*/  
  138.     return 1;  
  139. }  



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值