ifconfg.c源代码

/*Linux ifconfig,c简易源代码*/

#include <sys/ioctl.h>
#include <net/if.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <stdio.h>
#include <netinet/in.h>
int info_list(int all);
int get_interface_info(char * interface_name);
int set_interface(char * interface_name);
int get_ipaddr(char * interface_name);
int get_mac(char * interface_name);
int get_netmask(char * interface_name);
int get_broadcast(char * interface_name);
int set_ipaddr(char * interface_name,char * ip);
int set_mac(char * interface_name,char * mac);
int set_netmask(char * interface_name,char * netmask);
int set_broadcast(char * interface_name,char * broadcast);
int interface_up(char * interface_name);
int interface_down(char * interface_name);
int usage();
int main(int argc,char * argv[])
{   
    if(argc == 1)   
    {      
        info_list(0);
        return 0;
    }
    if(argc == 2)
    {
        if(strcmp(argv[1],"all") == 0)
        {
            info_list(1);
            return 0;
        }
        get_interface_info(argv[1]);
        return 0;
    }
    if(argc == 3)
    {
        if(strcmp(argv[2],"set") == 0)
        {
            set_interface(argv[1]);
            return 0;
        }
        if(strcmp(argv[2],"up") == 0)
        {
            interface_up(argv[1]);
            return 0;      
        }
        if(strcmp(argv[2],"down") == 0)
        {
            interface_down(argv[1]);
            return 0;
        }
        usage();
        return 0;
    }
    usage();
    return 0;
}
int info_list(int all)
{
    int len;
    char *ifreq_pointer;
    len = 10*sizeof(struct ifreq);
    ifreq_pointer = (char *)malloc(len);
    struct ifconf get_info;
    get_info.ifc_len = len;
    get_info.ifc_ifcu.ifcu_buf = ifreq_pointer;
    int sockfd;
    sockfd = socket(PF_INET,SOCK_STREAM,0);
    ioctl(sockfd,SIOCGIFCONF,&get_info);
    int count;   
    //获取网络接口数
    count = get_info.ifc_len / sizeof(struct ifreq);
    struct sockaddr_in * return_sockaddr;
    struct ifreq * result = (struct ifreq *)ifreq_pointer;
    int i = 0;
     //获取myifconfig all的参数
    if(all == 1)
    for(i;i<count;i++)
    {
        printf("%s\n",result[i].ifr_name);
        get_ipaddr(result[i].ifr_name);
        get_mac(result[i].ifr_name);
        get_netmask(result[i].ifr_name);
        get_broadcast(result[i].ifr_name);
    }
    else
    {
        struct ifreq tmp;
        int s;
        if((s = socket(PF_INET,SOCK_STREAM,0)) < 0)
        {
            perror("Socket");
            exit(-1);
        }
        //获取每个接口参数
        for(i;i<count;i++)
        {
            strcpy(tmp.ifr_name,result[i].ifr_name);
            if(ioctl(s,SIOCGIFFLAGS,&tmp) < 0)
            {
                perror("ioctl");
                exit(-1);
            }
            if((tmp.ifr_ifru.ifru_flags & IFF_UP) == 0)
                continue;
            printf("%s\n",tmp.ifr_name);
            get_ipaddr(tmp.ifr_name);
            get_mac(tmp.ifr_name);
            get_netmask(tmp.ifr_name);
            get_broadcast(tmp.ifr_name);
            }
        }
    exit(0);
}
//获取IP:SIOCGIFADDR
int    get_ipaddr(char * interface_name)
{
    int s;
    if((s = socket(PF_INET,SOCK_STREAM,0)) < 0)
    {
        perror("Socket");
        return -1;
    }
    struct ifreq ifr;
    strcpy(ifr.ifr_name,interface_name);
    if(ioctl(s,SIOCGIFADDR,&ifr) < 0)
    {
        perror("ioctl");
        return -1;
    }
    struct sockaddr_in * ptr;
    ptr = (struct sockaddr_in *)&ifr.ifr_ifru.ifru_addr;
    printf(" IP:%s\n",inet_ntoa(ptr->sin_addr));
    return 0;
}
//获取MAC:SIOCGIFHWADDR
int get_mac(char * interface_name)
{
    if(strcmp(interface_name,"lo") == 0)
    {
        return 0;
    }
    int s;
    if((s = socket(PF_INET,SOCK_STREAM,0)) < 0)
    {
        perror("Socket");
        return -1;
    }
    struct ifreq ifr;
    strcpy(ifr.ifr_name,interface_name);
    if(ioctl(s,SIOCGIFHWADDR,&ifr) != 0)
    {
        perror("ioctl");
        return -1;
    }
    u_char * ptr;
    ptr =(u_char *)&ifr.ifr_ifru.ifru_hwaddr.sa_data[0];
    printf(" MAC:%02x-%02x-%02x-%02x-%02x-%02x\n",*ptr,*(ptr+1),*(ptr+2),*(ptr+3),*(ptr+4),*(ptr+5));
    return 0;
}
//获取netmask:SIOCGIFNETMASK
int get_netmask(char * interface_name)
{
    int s;
    if((s = socket(PF_INET,SOCK_STREAM,0)) < 0)
    {
        perror("Socket");
        return -1;
    }
    struct ifreq ifr;
    strcpy(ifr.ifr_name,interface_name);
    if(ioctl(s,SIOCGIFNETMASK,&ifr) < 0)
    {
        perror("ioctl");
        return -1;
    }
    struct sockaddr_in * ptr;
    ptr = (struct sockaddr_in *)&ifr.ifr_ifru.ifru_netmask;
    printf(" Netmask:%s\n",inet_ntoa(ptr->sin_addr));
    return 0;
}
//获取广播地址:SIOCGIFBRDADDR
int get_broadcast(char * interface_name)
{
    int s;
    if((s = socket(PF_INET,SOCK_STREAM,0)) < 0)
    {
        perror("Socket");
        return -1;
    }
    struct ifreq ifr;
    strcpy(ifr.ifr_name,interface_name);
    if(ioctl(s,SIOCGIFBRDADDR,&ifr) < 0)
    {
        perror("ioctl");
        return -1;
    }
    struct sockaddr_in * ptr;
    ptr = (struct sockaddr_in *)&ifr.ifr_ifru.ifru_broadaddr;
    printf(" Broadcast:%s\n",inet_ntoa(ptr->sin_addr));
    return 0;
}
//获取接口信息
int get_interface_info(char * interface_name)
{
    get_ipaddr(interface_name);
    get_mac(interface_name);
    get_netmask(interface_name);
    get_broadcast(interface_name);
    return 0;
}
//设置接口信息
int set_interface(char * interface_name)
{
    char ip[18];
    char mac_addr[20];
    char netmask[18];
    char broadcast[18];
    printf("Change ");
    get_ipaddr(interface_name);
    printf("To:  ");
    fgets(ip,17,stdin);
    if(strcmp(ip,"\n") == 0)
        goto set_mac;
    set_ipaddr(interface_name,ip);
set_mac:
    printf("Change ");
    get_mac(interface_name);
    printf("To:  ");
    fgets(mac_addr,19,stdin);
    if(strcmp(mac_addr,"\n") == 0)
        goto set_netmask;
    set_mac(interface_name,mac_addr);
set_netmask:
    printf("Change ");
    get_netmask(interface_name);
    printf("To:  ");
    fgets(netmask,17,stdin);
    if(strcmp(netmask,"\n") == 0)
        goto set_broadcast;
    set_netmask(interface_name,netmask);
set_broadcast:    
    printf("Change ");
    get_broadcast(interface_name);
    printf("To:  ");
    fgets(broadcast,17,stdin);
    if(strcmp(broadcast,"\n") == 0)
        return 0;
    set_broadcast(interface_name,broadcast);
    return 0;
}
//ifconfig up接口:SIOCSIFFLAGS
int interface_up(char * interface_name)
{
    int s;
    if((s = socket(PF_INET,SOCK_STREAM,0)) < 0)
    {
        perror("Socket");
        return -1;
    }
    struct ifreq ifr;
    strcpy(ifr.ifr_name,interface_name);
    short flag;
    flag = IFF_UP;
    if(ioctl(s,SIOCGIFFLAGS,&ifr) < 0)
    {
        perror("ioctl");
        return -1;
    }
    ifr.ifr_ifru.ifru_flags |= flag;
    if(ioctl(s,SIOCSIFFLAGS,&ifr) < 0)
    {
        perror("ioctl");
        return -1;
    }
    return 0;
}
//关闭接口
int interface_down(char * interface_name)
{
    if(strcmp(interface_name,"lo") == 0)
    {
        printf("You can't pull down interface lo\n");
        return 0;    
    }
    int s;
    if((s = socket(PF_INET,SOCK_STREAM,0)) < 0)
    {
        perror("Socket");
        return -1;
    }
    struct ifreq ifr;
    strcpy(ifr.ifr_name,interface_name);
    short flag;
    flag = ~IFF_UP;
    if(ioctl(s,SIOCGIFFLAGS,&ifr) < 0)
    {
        perror("ioctl");
        return -1;
    }
    ifr.ifr_ifru.ifru_flags &= flag;
    if(ioctl(s,SIOCSIFFLAGS,&ifr) < 0)
    {
        perror("ioctl");
        return -1;
    }
    return 0;
}
//设置IP
int set_ipaddr(char * interface_name,char * ip)
{
    int s;
    if((s = socket(PF_INET,SOCK_STREAM,0)) < 0)
    {
        perror("Socket");
        return -1;
    }
    struct ifreq ifr;
    strcpy(ifr.ifr_name,interface_name);
    struct sockaddr_in addr;
    bzero(&addr,sizeof(struct sockaddr_in));
    addr.sin_family = PF_INET;
    inet_aton(ip,&addr.sin_addr);
    memcpy(&ifr.ifr_ifru.ifru_addr,&addr,sizeof(struct sockaddr_in));
    if(ioctl(s,SIOCSIFADDR,&ifr) < 0)
    {
        perror("ioctl");
        return -1;
    }
    return 0;
}
//设置MAC
int set_mac(char * interface_name,char * mac_addr)
{
    int s;
    if((s = socket(PF_INET,SOCK_STREAM,0)) < 0)
    {
        perror("Socket");
        return -1;
    }
    struct ifreq ifr;
    strcpy(ifr.ifr_name,interface_name);
    if(ioctl(s,SIOCGIFHWADDR,&ifr) < 0)
    {
        perror("ioctl");
        return -1;
    }
    sa_family_t get_family;
    get_family = ifr.ifr_ifru.ifru_hwaddr.sa_family;
    interface_down(interface_name);
    bzero(&ifr,sizeof(struct ifreq));
    strcpy(ifr.ifr_name,interface_name);
    ifr.ifr_ifru.ifru_hwaddr.sa_family = get_family;
    short tmp;
    int i,j;
    j = 0;
    for(i = 0;i < 17; i += 3)
    {
        if(mac_addr[i] < 58 && mac_addr[i] > 47)
            tmp = mac_addr[i]-48;
        if(mac_addr[i] < 71 && mac_addr[i] > 64)
            tmp = mac_addr[i]-55;
        if(mac_addr[i] < 103 && mac_addr[i] > 96)
            tmp = mac_addr[i]-87;
            tmp = tmp << 4;
        if(mac_addr[i+1] < 58 && mac_addr[i+1] > 47)
            tmp |= (mac_addr[i+1]-48);
        if(mac_addr[i+1] < 71 && mac_addr[i+1] > 64)
            tmp |= (mac_addr[i+1]-55);
        if(mac_addr[i+1] < 103 && mac_addr[i+1] > 96)
            tmp |= (mac_addr[i+1]-87);
        memcpy(&ifr.ifr_ifru.ifru_hwaddr.sa_data[j++],&tmp,1);
    }
    if(ioctl(s,SIOCSIFHWADDR,&ifr) < 0)
    {
        perror("ioctl");
        return -1;
    }
    interface_up(interface_name);
    return 0;
}
//设置掩码
int set_netmask(char * interface_name,char * netmask)
{  
    int s;
    if((s = socket(PF_INET,SOCK_STREAM,0)) < 0)
    {
        perror("Socket");
        return -1;
    }
    struct ifreq ifr;
    strcpy(ifr.ifr_name,interface_name);
    struct sockaddr_in netmask_addr;
    bzero(&netmask_addr,sizeof(struct sockaddr_in));
    netmask_addr.sin_family = PF_INET;
    inet_aton(netmask,&netmask_addr.sin_addr);
    memcpy(&ifr.ifr_ifru.ifru_netmask,&netmask_addr,sizeof(struct sockaddr_in));  
    if(ioctl(s,SIOCSIFNETMASK,&ifr) < 0)
    {
        perror("ioctl");
        return -1;  
    }
    return 0;
}
//设置广播地址
int set_broadcast(char * interface_name,char * broadcast)
{
    int s;
    if((s = socket(PF_INET,SOCK_STREAM,0)) < 0)
    {
        perror("Socket");
        return -1;
    }
    struct ifreq ifr;
    strcpy(ifr.ifr_name,interface_name);
    struct sockaddr_in broadcast_addr;
    bzero(&broadcast_addr,sizeof(struct sockaddr_in));
    broadcast_addr.sin_family = PF_INET;
    inet_aton(broadcast,&broadcast_addr.sin_addr);
    memcpy(&ifr.ifr_ifru.ifru_broadaddr,&broadcast_addr,sizeof(struct sockaddr_in));  
    if(ioctl(s,SIOCSIFBRDADDR,&ifr) < 0)
    {
        perror("ioctl");
        return -1;  
    }
    return 0;
}
int usage(void)
{
    printf("Usage: myifconfig [all]|[interface [set|up|down]]\n");
    return 0;
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值