一般,用户在shell中使用ifconfig命令对网络接口进行参数配置,及接口的打开,关闭等操作。ifconfig实现网络接口配置的原理在于代表网络接口的结构体struct net_device的成员ip_ptr。前文已经讲过,ip_ptr实际指向的是一个结构体struct in_device,in_device有一个成员struct in_ifaddr *ifa_list,它指向一个链表,链表的每一项代表一个IP地址。对这个链表操作即可实现对网络接口的配置。
网络接口的操作命令按功能可以分为两组,第一组为查询命令:SIOCGIFADDR,SIOCGIFBRDADDR,SIOCGIFDSTADDR, SIOCGIFNETMASK。分别用于查询网络接口的IP地址,广播地址,目的地址,子网掩码。第二组为设置命令:SIOCSIFADDR, SIOCSIFFLAGS,SIOCSIFBRDADDR,SIOCSIFNETMASK,SIOCSIFDSTADDR。分别用于设置网络接口的IP地址,标志位,广播地址,子网掩码,目的地址。这些命令所要查询和设置的信息全部在结构体struct in_ifaddr中。
用户空间的应用程序通过系统调用ioctl使用这些命令,ioctl的函数原型如下:
#include <sys/ioctl.h>
int ioctl(int d, int request, ...);
以上九个命令使用的参数为同一类型,即struct ifreq,其定义可在include/linux/if.h中找到。
下面是两组命令在my_inet模块中的使用示例,因为整个my_inet模块代码还很不完善,通过my_inet模块新添加的IP地址并不能正常使用。
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <linux/if.h>
#include "my_inet.h"
#include <stdio.h>
#include <errno.h>
#include <string.h>
int main()
{
struct ifreq req;
strncpy( req.ifr_name, "eth0", IFNAMSIZ );
struct sockaddr_in *sin;
int fd = socket( MY_PF_INET, SOCK_RAW, MY_IPPROTO_ICMP );
if( fd < 0 ){
perror("error: ");
return -1;
}
sin = (struct sockaddr_in *)&req.ifr_addr;
if( ioctl( fd, SIOCGIFADDR, &req) == 0 )
printf("%s/n", inet_ntoa(sin->sin_addr.s_addr) );
else
perror("ioctl error: ");
sin = (struct sockaddr_in *)&req.ifr_broadaddr;
if( ioctl( fd, SIOCGIFBRDADDR, &req) == 0 )
printf("%s/n", inet_ntoa(sin->sin_addr.s_addr) );
else
perror("ioctl error: ");
sin = (struct sockaddr_in *)&req.ifr_dstaddr;
if( ioctl( fd, SIOCGIFDSTADDR, &req) == 0 )
printf("%s/n", inet_ntoa(sin->sin_addr.s_addr) );
else
perror("ioctl error: ");
sin = (struct sockaddr_in *)&req.ifr_netmask;
if( ioctl( fd, SIOCGIFNETMASK, &req) == 0 )
printf("%s/n", inet_ntoa(sin->sin_addr.s_addr) );
else
perror("ioctl error: ");
close( fd );
return 0;
}
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <linux/if.h>
#include "my_inet.h"
#include <stdio.h>
#include <errno.h>
#include <string.h>
int main()
{
struct ifreq req;
strncpy( req.ifr_name, "eth0:0", IFNAMSIZ );
struct sockaddr_in *sin;
int fd = socket( MY_PF_INET, SOCK_RAW, MY_IPPROTO_ICMP );
if( fd < 0 ){
perror("error: ");
return -1;
}
sin = (struct sockaddr_in *)&req.ifr_addr;
sin->sin_family = MY_PF_INET;
if( inet_aton("172.16.48.10", &sin->sin_addr) == 0 ){
perror("inet_aton error: ");
return -1;
}
if( ioctl( fd, SIOCSIFADDR, &req ) == 0 ){
printf("success!/n");
}else{
perror("ioctl failed: ");
}
req.ifr_flags = IFF_UP;
if( ioctl( fd, SIOCSIFFLAGS, &req ) == 0 ){
printf("success!/n");
}else{
perror("ioctl failed: ");
}
sin->sin_family = MY_PF_INET;
if( inet_aton("172.16.48.255", &sin->sin_addr) == 0 ){
perror("inet_aton error: ");
return -1;
}
if( ioctl( fd, SIOCSIFBRDADDR, &req ) == 0 ){
printf("success!/n");
}else{
perror("ioctl failed: ");
}
sin->sin_family = MY_PF_INET;
if( inet_aton("255.255.255.0", &sin->sin_addr) == 0 ){
perror("inet_aton error: ");
return -1;
}
if( ioctl( fd, SIOCSIFNETMASK, &req ) == 0 ){
printf("success!/n");
}else{
perror("ioctl failed: ");
}
close( fd );
return 0;
}
要想让上述的代码发挥实际的作用,只要把所有的MY_PF_INET改成PF_INET即可。功能再作增强,就是一个ifconfig程序了。
详细解决方案
ifconfig 的简单实现
热度:4 发布时间:2024-01-21 13:28:21.0
相关解决方案
- php 通过 sudo 获取 ifconfig eth0 down权限解决办法
- ifconfig eth0 up 出有关问题!
- php 通过 sudo 获取 ifconfig eth0 down权限解决办法
- CentOS 7最小化安装后找不到‘ifconfig’命令——修复小提示
- 【Linux】CentOS 7 下 ifconfig command not found 解决
- Linux——网络(netstart、ping、ifconfig、dhclient)
- ubuntu 谷歌浏览器未连接到互联网 ifconfig ens33没有ipv4 ip地址 连不上网
- ifconfig wlan0 up详解
- linux ifconfig 命令的学习
- ifconfig - 在linux下配置网络
- linux -bash: ifconfig: command not found
- Linux ifconfig 后没有ip地址,子网掩码,和网关
- VMware 虚拟机 linux执行 ifconfig 命令没有IP地址
- ifconfig ip-route
- Centos7 最小化安装,导致 ifconfig,netstat 命令找不到
- ifconfig命令无法找到,提示 ifconfig: command not found
- 10.1 ifconfig:配置或显示网络接口信息
- bash:ifconfig commond not found in linux
- ubuntu-18.04.2 查看IP提示 Command ‘ifconfig‘ not found 解决方案
- [root@localhost ~]# ifconfig ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 eth
- ifconfig -a和ifconfig的区别
- Linux常用命令之网络命令详解(ping、ifconfig、mail、traceroute、netstat、setup、nslookup、route)
- Linux与shell学习 - ifconfig、ping、netstart的区别
- ifconfig: command not found
- Linux常用命令 - ifconfig
- ifconfig 用于查看和更改TCP/IP网络接口的地址和参数
- Ifconfig 如何获得流量统计信息
- ifconfig 源码分析
- ifconfig 的简单实现
- linux常用操作指令3—— 网络管理常用命令(netstat、ping 、host 、ifconfig、tcpdump )