struct in_addr ,struct sockadd,ifreq,eth0,ioctl
来源:互联网 发布:知乎 美国epic公司 编辑:程序博客网 时间:2024/05/20 01:47
本文以获取或设置机子IP为例分析struct in_addr ,struct sockadd,ifreq,eth0,ioctl
所有讲述均在Linux环境下完成
程序会用到以下结构体(结构体都有说明)
struct in_addr
struct in_addr {
};
typedef struct in_addr {
union {
} IN_ADDR;
struct sockaddr结构类型是用来保存socket信息的:
struct sockaddr {
另外更有一种结构类型:
struct sockaddr_in {
这个结构更方便使用。sin_zero用来将sockaddr_in结构填充到和struct sockaddr同样的长度,能用bzero()或memset()函数将其置为零。指向sockaddr_in的指针和指向sockaddr的指针能相互转换,这意味着如果一个函数所需参数类型是sockaddr时,你能在函数调用的时候将一个指向sockaddr_in的指针转换为指向sockaddr的指针;或相反。
在 /usr/include/linux/if.h里可以看到ifreq的定义
struct ifreq
struct ifreq
{
#define IFHWADDRLEN
};
#define ifr_name
#define ifr_hwaddr
#define ifr_addr
#define ifr_dstaddr
#define ifr_broadaddr
#define fr_netmask
#define ifr_flags
#define ifr_metric
#define ifr_mtu
#define ifr_map
#define ifr_slave
#define ifr_data
#define ifr_ifindex
#define ifr_bandwidth
#define ifr_qlen
#define ifr_newname
#define ifr_settings
在/usr/include/linux/sockio.h里可以查看对应操作的命令,如下列举部分
#define SIOCINQ
#define SIOCOUTQ
#define SIOCADDRT
#define SIOCDELRT
#define SIOCRTMSG
#define SIOCGIFNAME
#define SIOCSIFLINK
#define SIOCGIFCONF
#define SIOCGIFFLAGS
#define SIOCSIFFLAGS
#define SIOCGIFADDR
#define SIOCSIFADDR
#define SIOCGIFDSTADDR
#define SIOCSIFDSTADDR
#define SIOCGIFBRDADDR
#define SIOCSIFBRDADDR
#define SIOCGIFNETMASK
#define SIOCSIFNETMASK
以上是要用到的数据类型以及命令等,
示例程序如下:
#include <errno.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <linux/if.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <net/if_arp.h>
获得IP:
void main(void)
{
}
设置 IP
static struct sockaddr_in
};
void
{
}
此处ioctl函数是在驱动程序里的,ioctl可以向内核传递参数
ioctl是设备驱动程序中对设备的I/O通道进行管理的函数。可以对设备进行一些操作,它的调用如下:
int ioctl(int fd, ind cmd, …);
其中fd就是用户程序打开设备时使用open函数返回的文件标示符,cmd就是用户程序对设
备的控制命令,至于后面的省略号,那是一些补充参数,一般最多一个,有或没有是和cmd的意义相关的。
第一个参数fd是一个文件描述符,我们这里是建立的一个套接字描述符
第二个参数,是在sockios.h中定义的一个32位描述符,我们也可以在这里添加新的类型,用来扩展实际需求。
第三个参数,是一个指针,用来指向某些我们实际应用中的参数。
ioctl函数是文件结构中的一个属性分量,就是说如果你的驱动程序提供了对ioctl的支
持,用户就可以在用户程序中使用ioctl函数控制设备的I/O通道。
一般的说,,用户空间的IOCTL系统调用如下所示:
因为这个调用拥有与网络相关的代码,所以文件描述符号fd就是socket()系统调用所返回的,而command参数可以是/usr/include/linux/sockios.h头文件中的任何一个,以上有列举及其控制的行为,这些个命令根据它可以解决的问题所涉及的方面被分为多种的类型.
比如:
改变路由表(SIOCADDRT, SIOCDELRT)
读取或更新ARP/RARP缓存(SIOCDARP, SIOCSRARP)
网络接口相关的ioctl命令最具有代表性的特征为都是以S或G开头,其实就是设置(SET)或得到(GET)数据, getifinfo.c程序用这些命令去读取IP地址信息,硬件地址信息,广播地址信息,和与网络接口相关的标志.
对于这些ioctl,第三个参数是一个IFREQ结构体,这个结构体被定义在/usr/include/linux/if.h头文件中,以上有说明,根据常规约定,一个用户程序调用一个特定的ioctl命令如下: ioctl(sockid, SIOCDEVPRIVATE, (char *) &ifr)这里ifr是一个ifreq结构体变量,它用一个和这个设备联系的接口名称填充ifr的ifr NAME域,比如,前述的网卡接口名称为eth0(系统有一块网卡,在网卡在程序中交互为“eth0”,依次,eth1,eth2,…,需要操作第n块网卡,就指定ethn)。
程序实现为
ifname是字符串指针,即 char* ifname = "eth0"
IFNAMSIZ是系统特定的,在/usr/include/linux/if.h中 #define IFNAMSIZ
本文有所借鉴,希望大家相互探讨!
- struct in_addr ,struct sockadd,ifreq,eth0,ioctl
- 简析struct in_addr ,struct sockadd
- ioctl, struct ifreq, struct ifconf
- ioctl和struct ifreq
- ioctl和struct ifreq
- ioctl struct ifreq
- ioctl和struct ifreq
- ioctl和struct ifreq
- ioctl和struct ifreq
- ioctl和struct ifreq
- socket ioctl socket options struct ifreq; struct ifconf
- struct ifreq
- struct ifreq
- struct ifreq
- struct ifreq
- struct in_addr
- struct in_addr
- struct ifconf 和struct ifreq
- 对51单片机中断系统的理解
- Java中获取特定符号中间字符串子串的方法
- 巧用excel表格数据做sql
- Linux中Swap与Memory内存简单介绍
- 迷茫中的实验楼学习-数据结构1
- struct in_addr ,struct sockadd,ifreq,eth0,ioctl
- Apache Kafka cluster environment 环境搭建
- map容器的基本操作
- poj2100(尺取模型,总结)
- linux下如何编译自己的动态链接库
- Fzu 2185 树的路径覆盖【思维+贪心】好题~
- HDU4506 小明系列故事——师兄帮帮忙(快速幂取模)
- Sqoop-1.4.4工具import和export使用详解
- HTML5基础之常用标签以及标签选择器