天天看點

linux 利用ioctl函數擷取IP位址、子網路遮罩、MAC位址和修改本機IP位址、子網路遮罩、網關

ioctl函數原型:

int ioctl(int fd, int request, ....)

int fd:為socket函數傳回值

int request:SIOCSIFADDR 修改ip位址

                    SIOCSIFNETMASK 修改子網路遮罩

                    SIOCADDRT  修改網關

第三個參數:ip和子網路遮罩對應的結構體struct  ifreq;網關的結構體struct rtentry

//.h

#include <stdlib.h>
#include <string.h>
#include <pcap.h> 
#include <sys/types.h>
#include <sys/socket.h>  
#include <netinet/in.h> 
#include <netinet/ip.h>
#include <netinet/ether.h> 
#include <net/if.h>  
#include <arpa/inet.h> 
#include <net/if_arp.h>    
#include <sys/ioctl.h> 
#include <string.h>  
#include <errno.h> 
#include <unistd.h> 
#include <net/route.h>           

//.cpp 修改ip位址

bool SetLocalIp(char *ipaddr)  
{  
    if (NULL == ipaddr)
    {
        printf("SetLocalIp: ipaddr is null\n");
        return false;
    }
  
    int sock_set_ip;  
      
    struct sockaddr_in sin_set_ip;  
    struct ifreq ifr_set_ip;  
  
    bzero( &ifr_set_ip,sizeof(ifr_set_ip));  
   
    if( ipaddr == NULL )  
        return false;  

    if(sock_set_ip = socket(PF_INET, SOCK_STREAM, 0 ) == -1);  
    {  
        perror("socket create failse...SetLocalIp!/n");  
        return false;  
    }  
  
    memset( &sin_set_ip, 0, sizeof(sin_set_ip));  
    strncpy(ifr_set_ip.ifr_name, "eth0", sizeof(ifr_set_ip.ifr_name)-1);     
      
    sin_set_ip.sin_family = AF_INET;  
    sin_set_ip.sin_addr.s_addr = inet_addr(ipaddr);  
    memcpy( &ifr_set_ip.ifr_addr, &sin_set_ip, sizeof(sin_set_ip));  
  
    if( ioctl( sock_set_ip, SIOCSIFADDR, &ifr_set_ip) < 0 )  
    {  
        perror( "Not setup interface/n");  
        return false;  
    }  
   
    ifr_set_ip.ifr_flags |= IFF_UP |IFF_RUNNING;  
  
    //get the status of the device  
    if( ioctl( sock_set_ip, SIOCSIFFLAGS, &ifr_set_ip ) < 0 )  
    {  
         perror("SIOCSIFFLAGS");  
         return false;  
    }  
  
    close( sock_set_ip); 
   
    return true;  
}           

//.cpp 修改子網路遮罩

bool SetLocalNetMask(char *netMask)
{
    int socketfd;
    
    if (NULL == netMask)
    {
        printf("SetLocalNetMask: netMask is null\n");
        return false;
    }

    if(socketfd = socket(PF_INET, SOCK_STREAM, 0 ) == -1);  
    {  
        perror("socket create failse...SetLocalNetMask!/n");  
        return false;  
    } 

    struct ifreq ifr_mask;
    struct sockaddr_in *sin_net_mask;

    memset(&ifr_mask, 0, sizeof(ifr_mask));
    strncpy(ifr_mask.ifr_name, "eth0", sizeof(ifr_mask.ifr_name) - 1);
    sin_net_mask = (struct sockaddr_in *)&ifr_mask.ifr_addr;
    sin_net_mask->sin_family = AF_INET;
    inet_pton(AF_INET, netMask, &sin_net_mask->sin_addr);

    if (ioctl(socketfd, SIOCSIFNETMASK, &ifr_mask) < 0)
    {
        printf("socket_netmask ioctl error!\n");
        return false;
    }

    close( socketfd );    
    return true;
}           

//.cpp 修改網關

bool SetLocalRoute(char *szGateWay)
{
    int sockfd;
    
    sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    if (sockfd == -1)
    {
        return false;
    }

    struct rtentry rmten;
    struct sockaddr_in ic_gateway ;	// Gateway IP address 
    int err;
    
    memset(&rmten, 0, sizeof(rmten));
       
    ic_gateway.sin_family = AF_INET; 
    ic_gateway.sin_addr.s_addr = inet_addr(szGateWay);
    ic_gateway.sin_port = 0; 

    ((struct sockaddr_in*)&rmten.rt_dst)->sin_family = AF_INET;
    ((struct sockaddr_in*)&rmten.rt_dst)->sin_addr.s_addr = 0;
    ((struct sockaddr_in*)&rmten.rt_dst)->sin_port = 0;

    ((struct sockaddr_in*)&rmten.rt_genmask)->sin_family = AF_INET;
    ((struct sockaddr_in*)&rmten.rt_genmask)->sin_addr.s_addr = 0;
    ((struct sockaddr_in*)&rmten.rt_genmask)->sin_port = 0;

    memcpy((void *) &rmten.rt_gateway, &ic_gateway, sizeof(ic_gateway));
    rmten.rt_flags = RTF_UP | RTF_GATEWAY;
    
    if ((err = ioctl(sockfd, SIOCADDRT, &rmten)) < 0) 
    {
        printf("ioctl net error!\n");
        return false;
    }

    close( sockfd );
    return true;
}           

//.cpp 獲得IP位址、子網路遮罩、MAC實體位址

bool GetIpMacMaskAddress()
{
    unsigned char ipaddress[INET_MACADDRESSLEN];    
    unsigned char macaddress[INET_MACADDRESSLEN];
    unsigned char netmask[INET_MACADDRESSLEN];
    
    struct ifreq struReq;
    memset(&struReq, 0x00, sizeof(struct ifreq));
    strncpy(struReq.ifr_name, "eth0", sizeof(struReq.ifr_name));  
    
    socketfd = socket(PF_INET, SOCK_STREAM, 0);
    
    if (-1 == ioctl(socketfd, SIOCGIFHWADDR, &struReq))
    {
        printf("ioctl hwaddr error!\n");
        return false;
    }

    strcpy((char *)macaddress, ether_ntoa((ether_addr*)struReq.ifr_hwaddr.sa_data)); 

    if (-1 == ioctl(socketfd, SIOCGIFADDR, &struReq))
    {
        printf("ioctl ip address error!\n");
        return false;
    }

    strcpy((char *)ipaddress, inet_ntoa(((struct sockaddr_in *)&(struReq.ifr_addr))->sin_addr));

    if (-1 == ioctl(socketfd, SIOCGIFNETMASK, &struReq))
    {
        printf("ioctl net mask error!\n");
        exit(1);
    }

    strcpy((char *)netmask, inet_ntoa(((struct sockaddr_in *)&(struReq.ifr_netmask))->sin_addr));    

    printf("MacAddress: %s\n", macaddress);
    printf("IpAddress: %s\n", ipaddress);
    printf("NetMask: %s\n",netmask);

    close(socketfd);

    return true;   
}           

繼續閱讀