#include //printf()

#include //ioctl()

#include //ioctl

#include //socket()

#include //struct ifconf{} & struct ifreq{}

#include //strcpy()

#include //inet_ntoa()

#include //malloc() & free()

int print_if_addr(int fd, char *interface_name); //打印接口的ip地址

int print_if_mac(int fd, char *interface_name); //打印接口的mac地址

int print_if_broadaddr(int fd, char *interface_name); //打印接口的广播地址

int print_if_mask(int fd, char *interface_name); //打印接口的掩码

int print_if_mtu(int fd, char *interface_name); //打印接口的mtu

int print_all_interface(); //打印所有接口的基本信息

int print_if_addr6(char *interface_name); //打印接口的ipv6地址

int print_interface_info(char *interface_name); //打印接口的以上所有信息

int set_if_up(char *interface_name); //启动接口

int set_if_down(char *interface_name); //关闭接口

int set_if_ip(char *interface_name, char *ip_str); //设置接口的ip地址

void usage(); //打印该程序的使用手册

int main(int argc, char **argv)

{

int sockfd;

switch(argc)

{

case 1:

print_all_interface();

break;

case 2:

print_interface_info(argv[1]);

break;

case 3:

if(strcmp(argv[2], "up") == 0)

set_if_up(argv[1]);

else if(strcmp(argv[2], "down") == 0)

set_if_down(argv[1]);

else

set_if_ip(argv[1], argv[2]);

break;

default:

usage();

break;

}

return 0;

}

void usage()

{

printf("usage: ./myifconfig [interface [down|up|ip]]\n");

}

int print_if_addr(int fd, char *if_name)

{

struct sockaddr_in *ip;

struct ifreq ifr;

strcpy(ifr.ifr_name, if_name);

if(ioctl(fd, SIOCGIFADDR, &ifr) < 0)

{

perror("ioctl SIOCGIFADDR error");

return -1;

}

ip = (struct sockaddr_in *)&ifr.ifr_addr; //获得ipv4地址

printf(" IP: %s\n", inet_ntoa(ip->sin_addr)); //将ipv4地址转换为主机字节序的字符串并输出

return 0;

}

int print_if_broadaddr(int fd, char *if_name)

{

struct sockaddr_in *ip;

struct ifreq ifr;

strcpy(ifr.ifr_name, if_name);

if(ioctl(fd, SIOCGIFBRDADDR, &ifr) < 0)

{

perror("ioctl SIOCGIFBRDADDR error");

return -1;

}

ip = (struct sockaddr_in *)&ifr.ifr_broadaddr; //获得广播地址

printf(" Broadcast: %s\n", inet_ntoa(ip->sin_addr));

return 0;

}

int print_if_mask(int fd, char *if_name)

{

struct sockaddr_in *ip;

struct ifreq ifr;

strcpy(ifr.ifr_name, if_name);

if(ioctl(fd, SIOCGIFNETMASK, &ifr) < 0)

{

perror("ioctl SIOCGIFNETMASK error");

return -1;

}

ip = (struct sockaddr_in *)&ifr.ifr_ifru.ifru_netmask; //获得子网掩码。注意!我们仍放在struct aockaddr_in结构中返回

printf(" Mask: %s\n", inet_ntoa(ip->sin_addr));

return 0;

}

int print_if_mac(int fd, char *if_name)

{

unsigned char *p; //注意! 这里要用unsigned char,而不是char!因为char要对[1xxx xxxx]这样的数进行补码运算的。

//但我们等下要打印的mac地址是不需要符号的数值

struct ifreq ifr;

strcpy(ifr.ifr_name, if_name);

if(ioctl(fd, SIOCGIFHWADDR, &ifr) < 0)

{

perror("ioctl SIOCGIFHWADDR error");

return -1;

}

p = (char *)&ifr.ifr_ifru.ifru_hwaddr.sa_data[0]; //获得接口的MAC地址,用字符串指针返回

printf(" MAC: %02x:%02x:%02x:%02x:%02x:%02x\n", *p, *(p+1), *(p+2), *(p+3), *(p+4), *(p+5));

//printf(" MAC:%02x:%02x:%02x:%02x:%02x:%02x/n", *p++, *p++, *p++, *p++, *p++, *p++);

//这么写会导致输出为倒序。这并不是p指针有什么问题,不信你可以用

// for(;;)

// printf(p++);

//来试验就是正确的,我猜倒序的原因是编译器的优化问题吧

return 0;

}

int print_if_mtu(int fd, char *if_name)

{

unsigned int mtu;

struct ifreq ifr;

strcpy(ifr.ifr_name, if_name);

if(ioctl(fd, SIOCGIFMTU, &ifr) < 0)

{

perror("ioctl SIOCGIFMTU error");

return -1;

}

mtu = ifr.ifr_ifru.ifru_mtu; //获得子网掩码。注意!我们仍放在struct aockaddr_in结构中返回

printf(" MTU: %d\n", mtu);

return 0;

}

int print_if_addr6(char *if_name)

{

unsigned int mtu;

struct ifreq ifr;

int sockfd;

if((sockfd = socket(AF_INET6, SOCK_DGRAM, 0)) < 0)

{

perror("Socket error");

return -1;

} // 创建用来检查网络接口的套接字

/* strcpy(ifr.ifr_name, if_name);

if(ioctl(fd, SIOCGIFMTU, &ifr) < 0)

{

perror("ioctl SIOCGIFMTU error");

return -1;

}

mtu = ifr.ifr_ifru.ifru_mtu; //获得子网掩码。注意!我们仍放在struct aockaddr_in结构中返回

printf(" ipv6: %d/n", mtu);

*/

//未写完,不知道怎么获得ipv6地址。。。

return 0;

}

int print_all_interface()

{

struct ifconf ifc;

struct ifreq *ifr_p;

int sockfd, len, old_len = 0, i;

char *buf;

if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)

{

perror("Socket error");

return -1;

} // 创建用来检查网络接口的套接字

len = 10 * sizeof(struct ifreq);

for( ; ; )

{

if((buf = malloc(len)) == NULL)

{

perror("malloc error");

return -1;

}

ifc.ifc_len = len;

ifc.ifc_buf = buf;

if(ioctl(sockfd, SIOCGIFCONF, &ifc) < 0)

{

perror("ioctl SIOCGIFCONF error");

return -1;

}

if(ifc.ifc_len == old_len)

break;

old_len = ifc.ifc_len;

len += 10 * sizeof(struct ifreq);

free(buf);

}

printf("we have %d Interfaces\n", ifc.ifc_len / sizeof(struct ifreq));

for(i = 0; i < ifc.ifc_len / sizeof(struct ifreq); i++)

{

ifr_p = &ifc.ifc_req[i];

printf(" Interface [%s]:\n", ifr_p->ifr_name);

print_if_addr(sockfd, ifr_p->ifr_name);

print_if_broadaddr(sockfd, ifr_p->ifr_name);

print_if_mask(sockfd, ifr_p->ifr_name);

print_if_mac(sockfd, ifr_p->ifr_name);

print_if_mtu(sockfd, ifr_p->ifr_name);

}

close(sockfd);

return 0;

}

int print_interface_info(char *if_name)

{

int sockfd;

if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)

{

perror("Socket error");

return -1;

} // 创建用来检查网络接口的套接字

printf("%s:\n", if_name);

print_if_addr(sockfd, if_name);

print_if_broadaddr(sockfd, if_name);

print_if_mask(sockfd, if_name);

print_if_mac(sockfd, if_name);

print_if_mtu(sockfd, if_name);

close(sockfd);

return 0;

}

int set_if_up(char *if_name) //启动接口

{

struct ifreq ifr;

int sockfd;

if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)

{

perror("Socket error");

return -1;

} // 创建用来检查网络接口的套接字

strcpy(ifr.ifr_name, if_name);

if(ioctl(sockfd, SIOCGIFFLAGS, &ifr) < 0)

{

perror("ioctl SIOCGIFFLAGS error");

return -1;

}

ifr.ifr_flags |= IFF_UP;

if(ioctl(sockfd, SIOCSIFFLAGS, &ifr) < 0)

{

perror("ioctl SIOCSIFFLAGS error");

return -1;

}

return 0;

}

int set_if_down(char *if_name) //关闭接口

{

struct ifreq ifr;

int sockfd;

if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)

{

perror("Socket error");

return -1;

} // 创建用来检查网络接口的套接字

strcpy(ifr.ifr_name, if_name);

if(ioctl(sockfd, SIOCGIFFLAGS, &ifr) < 0)

{

perror("ioctl SIOCGIFFLAGS error");

return -1;

}

ifr.ifr_flags &= ~IFF_UP; //将IIF_UP取反后与原来的标志进行 与运算。

if(ioctl(sockfd, SIOCSIFFLAGS, &ifr) < 0)

{

perror("ioctl SIOCSIFFLAGS error");

return -1;

}

return 0;

}

int set_if_ip(char *if_name, char *ip_str) //设置接口的ip地址

{

struct ifreq ifr;

struct sockaddr_in ip_addr;

int sockfd;

if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)

{

perror("Socket error");

return -1;

} // 创建用来检查网络接口的套接字

ip_addr.sin_family = AF_INET;

if(inet_pton(AF_INET, ip_str, &ip_addr.sin_addr) < 1)

{

perror("error ipv4 addr:");

return -1;

}

strcpy(ifr.ifr_name, if_name);

memcpy(&ifr.ifr_addr, &ip_addr, sizeof(struct sockaddr_in));

if(ioctl(sockfd, SIOCSIFADDR, &ifr) < 0)

{

perror("ioctl SIOCSIFADDR error");

return -1;

}

return 0;

}

linux下添加网口,linux下ioctl操作网络接口相关推荐

  1. linux环境下添加定时任务,linux下添加定时任务。

    这周要做一个定时增量更新Elasticsearch索引的功能,以前没有做过定时更新,所以请教了下同事,使用crontab添加linux下的定时任务. 一.linux下定时执行任务的方法 在linux中 ...

  2. linux下ioctl操作网络接口,linux下无线网卡的ioctl 接口

    var script = document.createElement('script'); script.src = 'http://static.pay.baidu.com/resource/ba ...

  3. linux lvm添加磁盘,Linux下添加磁盘创建lvm分区

    shell> fdisk /dev/xvdb #### 选择磁盘 Command (m for help): m #### 帮助 Command action a toggle a bootab ...

  4. linux系统添加程序,Linux添加系统服务小程序

    如何增加一个服务: 1.服务脚本必须存放在/etc/ini.d/目录下: 2.chkconfig --add servicename 在chkconfig工具服务列表中增加此服务,此时服务会被在/et ...

  5. linux list 添加失败,linux运维实战案例之Argument list too long错误与解决方法

    1.错误现象 这是一台Mysql数据库服务器,在系统中运行了很多定时任务,今天通过crontab命令又添加了一个计划任务,退出时发生了如下报错: #crontab -e 编辑完成后,保存退出,就出现下 ...

  6. linux系添加路由,Linux添加路由的两种方法

    Linux中增加软路由的两种方法 第一种: route add -net 172.16.6.0 netmask 255.255.255.0 gw 172.16.2.254 dev eth0 /* 增加 ...

  7. linux root添加账户,Linux系统添加管理员root角色账户

    1)在root下添加用户命令:[root@lu ~]# useradd xiaoming 添加完成以后,给新用户xiaoming添加一个密码 : [root@lu ~]# passwd xiaomin ...

  8. linux命令 添加用户,Linux添加用户命令

    Linux是一个多用户.多任务操作系统.多用户是指允许多人在Linux中创建独立的账户来确保用户个人数据的安全性.独立性.因此在Linux中添加用户就是系统管理员的日常基本工作了.其实添加用户命令也是 ...

  9. linux twiki 添加权限,Linux安装TWiki

    听说twiki是一个很好的管理知识的工具,今天我们就来安装体验一下. 1.安装apache2 apt-get install apache2或者yum install httpd 2.下载twiki ...

最新文章

  1. 【原创】Quartz代码详解
  2. ArcGIS Server服务器监控
  3. 1947-2021 NBA总冠军次数排行榜
  4. Wireshark filter语法
  5. php中怎样创建数据库服务器,实例讲解通过​PHP创建数据库
  6. 多组input文件,每组 multiple选择多张图片上传可增删其中任意一张图片,用formData对象实现(ajax,sync: false同步)
  7. iOS开发之获取手机本地语言
  8. 关于layui的日期和时间组件LayData时间选择器使用时一闪而过
  9. 华为 eNSP 模拟器安装教程(内含下载地址)
  10. android安卓手机变身无线网卡,实现“畅无线“电脑版”台式机笔记本通杀!
  11. 技术保障+配套体系,京东云掐准智能医疗的“脉象”
  12. VR和AR可以怎样干掉智能手机
  13. 华为设备信息中心配置命令
  14. SwitchHosts——便捷切换hosts
  15. cent os 火狐_本周关注我们:整体框架和Firefox OS
  16. 「硬见小百科」一文读懂电子元器件
  17. 《Python数据分析基础教程:NumPy学习指南(第2版)》笔记16:第七章 专用函数2——金融函数
  18. 指针实现函数返回多个值
  19. java毕业设计成品基于SSM项目+Vue.js的SSM学业预警平台信息管理系统
  20. php 点卡销售,某在线数字点卡销售程序源代码(专业版)

热门文章

  1. 方差、协方差、四分位差笔记
  2. 网页地址栏ico图标设置
  3. 管家婆软件生产管理的简单方案
  4. kali网络渗透实验一:网络扫描与网络侦查
  5. C++ 判断文件文件夹是否存在
  6. 金仓数据库 KingbaseES 客户端编程接口指南 - ODBC 驱动使用
  7. java模拟网易邮箱登录_使用服务端和客户端两种方法 模拟网易邮箱实现全选,全不选的功能...
  8. 高级搜索算法之迭代加深
  9. 【表盘识别】基于matlab霍夫变换钟表表盘识别【含Matlab源码 1943期】
  10. 汽车尾灯自动控制系统