大名做网站,百度灰色词优化排名,怎样免费建立个人网站,住建部网站村镇建设管理平台ioctl操作传统上ioctl函数是用于那些普遍使用#xff0c;但不适合归入其他类别的任何特性的系统接 口。Posix去掉了ioctl#xff0c;它通过创建特殊的其功能已被Posix标准化的包裹函数来代替ioctl。这一章介绍和网络 编程有关的ioctl操作。1. ioctl函数int ioctl(int d, int … ioctl操作 传统上ioctl函数是用于那些普遍使用但不适合归入其他类别的任何特性的系统接 口。Posix去掉了ioctl它通过 创建特殊的其功能已被Posix标准化的包裹函数来代替ioctl。这一章介绍和网络 编程有关的ioctl操作。 1. ioctl函数 int ioctl(int d, int request, ...); 和网络有关的ioctl请求有6类 套接口操作 文件操作 接口操作 ARP高速缓存操作 路由表操作 流系统 2. 套接口操作 类别请求描述数据类型套接口SIOCATMASK在带外标志上吗int SIOCSPGRP设置套接口的进程ID和进程组IDint SIOCGPGPR获取套接口的进程ID和进程组IDint SIOCATMASK 如果套接口的读指针在带外标志上则通过第三个参数指向的整数返回一个非零值否则返回零。 3. 文件操作 类别请求描述数据类型文件操作FIONBIO设置/清除非阻塞标志intFIOASYNC设置/清除异步I/O标志intFIONREAD获取接收缓冲区中数据的字节数intFIOSETOWN设置文件的进程ID或进程组IDintFIOGETOWN获取文件的进程ID或进程组IDint FIONBIO 这个请求和用fcntl的F_SETFL命令设置和清除O_NONBLOCK标志效果相同。 4. 接口配置 类别请求描述数据类型接口SIOCGIFCONF获取所有接口的列表struct ifconfSIOCSIFADDR设置接口地址struct ifreqSIOCGIFADDR获取接口地址struct ifreqSIOCSIFFLAGS设置接口标志struct ifreqSIOCGIFFLAGS获取接口标志struct ifreqSIOCSIFDSTADDR设置点对点地址struct ifreqSIOCGIFDSTADDR获取点对点地址struct ifreqSIOCGIFBRDADDR获取广播地址struct ifreqSIOCSIFBRDADDR设置广播地址struct ifreqSIOCGIFNETMASK获取子网掩码struct ifreqSIOCSIFNETMASK设置子网掩码struct ifreqSIOCGIFMETRIC获取接口的测度(metric)struct ifreqSIOCSIFMETRIC设置接口的测度(metric)struct ifreqSIOCxxx 5. ARP 类别请求描述数据类型ARPSIOCSARP创建/修改ARP项struct arpreqSIOCGARP获取ARP项struct arpreqSIOCDARP删除ARP项struct arpreq 6. 路由 类别请求描述数据类型路由SIOCADDRT增加路径struct rtentrySIOCDELRT删除路径struct rtentry 套接口ioctl函数 #include unistd.hint ioctl(int fd, int request, … /* void *arg */ );返回成功返回0出错返回-1。第三个参数总是一个指针但指针的类型依赖于request。 ioctl和网络有关的请求可分为如下6类 类别request描述数据类型套接口SIOCATMARK在带外标志上吗intSIOCSPGRP设置套接口的进程ID或进程组IDintSIOCGPGRP获取套接口的进程ID或进程组IDint文件FIONBIO设置/清除非阻塞标志intFIOASYNC设置/清除异步I/O标志intFIONREAD获取接收缓冲区中的字节数intFIOSETOWN设置文件的进程ID或进程组IDintFIOGETOWN获取文件的进程ID或进程组IDint接口SIOCGIFCONF获取所有接口的列表struct ifconfSIOCSIFADDR设置接口地址struct ifreqSIOCGIFADDR获取接口地址struct ifreqSIOCSIFFLAGS设置接口标志struct ifreqSIOCGIFFLAGS获取接口标志struct ifreqSIOCSIFDSTADDR设置点到点地址struct ifreqSIOCGIFDSTADDR获取点到点地址struct ifreqSIOCGIFBRDADDR 获取广播地址struct ifreqSIOCSIFBRDADDR设置广播地址struct ifreqSIOCGIFNETMASK获取子网掩码struct ifreqSIOCSIFNETMASK设置子网掩码struct ifreqSIOCGIFMETRIC获取接口的测度metricstruct ifreqSIOCSIFMETRIC设置接口的测度metricstruct ifreqSIOCxxx有很多依赖于实现ARPSIOCSARP创建/修改ARP项struct arpreqSIOCGARP获取ARP项struct arpreqSIOCDARP删除ARP项struct arpreq路由SIOCADDRT增加路径struct rtentrySIOCDELRT删除路径struct rtentry流I_xxx (1)套接口操作 SIOCATMARK如果套接口的读指针当前在带外标志上则通过第三个参数指向的整数返回一个非零值否则返回零。Posix.1g 用sockatmark代替了这种请求。SIOCGPGRP通过第三个参数指向的整数返回为接收来自这个套接口的SIGIO或SIGURG信号而设置的进程ID或进程组ID。 这和fcntl的F_GETOWN相同。SIOCSPGRP用第三个参数指向的整数设置进程ID或进程组ID以接收这个套接口的SIGIO或SIGURG信号。这和fcntl 的F_SETOWN相同。(2)文件操作 FIONBIO套接口的非阻塞标志会根据第三个参数指向的值是否为零而清除或设置。等价于fcntl的F_SETFL设置/清除 O_NONBLOCK标志。FIOASYNC根据第三个参数指向的值是否为零决定清除或接收套接口上的异步I/O信号。等价于fcntl的F_SETFL设置和清 除O_AYNC标志。FIONREAD在第三个参数指向的整数中返回套接口接收缓冲区中当前的字节数。FIOSETOWN在套接口上等价于SIOCSPGRP。FIOGETOWN在套接口上等价于SIOCGPGRP。(3)接口配置 SIOCGIFCONF从内核中获取系统中配置的所有接口。它使用了结构ifconfifconf又使用了ifreq结构。结构定义如下struct ifconf { int ifc_len; /* size of buffer, value-result */ union { caddr_t ifcu_buf; /* input from user-kernel */ struct ifreq *ifcu_req; /* return from kernel-user */ }ifc_ifcu;};#define ifc_buf ifc_ifcu.ifcu_buf#define ifc_req ifc_ifcu.ifcu_req#define IFNAMSIZ 16 struct ifreq { char ifr_name[IFNAMSIZ]; union { struct sockaddr ifru_addr; struct sockaddr ifru_dstaddr; struct sockaddr ifru_broadaddr; short ifru_flags; int ifru_metric; caddr_t ifru_data; }ifr_ifru;};#define ifr_addr ifr_ifru.ifru_addr#define ifr_dstaddr ifr_ifru.ifru_dstaddr#define ifr_broadaddr ifr_ifru.broadaddr#define ifr_flags ifr_ifru.ifru_flags#define ifr_metric ifr_ifru.ifru_metric#define ifr_data ifr_ifru.ifru_data 在调用ioctl之前分配一个缓冲区和一个ifconf结构然后初始化后者iotctl的第三个参数指向ifconf结构。 一个实现获取所有接口的程序可参见unpv12elib/get_ifi_info.c (4)接口操作 SIOCGIFCONF从内核中获取系统中配置的所有接口。(5)ARP高速缓存操作 (6)路由表操作 NAME netdevice - 底层访问 Linux 网络设备. 总览 (SYNOPSIS) #include sys/ioctl.h #include net/if.h 描述 (DESCRIPTION) 本手册 描述 用于 配置 网络设备 的 套接字(socket) 接口. Linux 支持 一些 配置 网络设备 的 标准 ioctl. 他们 用于 任意的 套接字 描述符, 而 无须 了解 其 类型 或 系列. 他们 传递 一个 ifreq 结构: struct ifreq{ char ifr_name[IFNAMSIZ]; /* Interface name */ union { struct sockaddr ifr_addr; struct sockaddr ifr_dstaddr; struct sockaddr ifr_broadaddr; struct sockaddr ifr_netmask; struct sockaddr ifr_hwaddr; short ifr_flags; int ifr_ifindex; int ifr_metric; int ifr_mtu; struct ifmap ifr_map; char ifr_slave[IFNAMSIZ]; char ifr_newname[IFNAMSIZ]; char * ifr_data; };}struct ifconf { int ifc_len; /* size of buffer */ union { char * ifc_buf; /* buffer address */ struct ifreq *ifc_req; /* array of structures */ }; }; 一般说来, ioctl 通过 把 ifr_name 设置为 接口 的 名字 来 指定 将要 操作 的 设备. 结构的 其他成员 可以 分享 内存. IOCTLS 如果 某个 ioctl 标记为 特权操作, 那么 操作时 需要 有效uid 为 0, 或者 拥有 CAP_NET_ADMIN 能力. 否则 将 返回 EPERM . SIOCGIFNAME给定 ifr_ifindex, 返回 ifr_name 中 的 接口名字. 这是 唯一 返回 ifr_name 内容 的 ioctl.SIOCGIFINDEX把 接口 的 索引 存入 ifr_ifindex.SIOCGIFFLAGS, SIOCSIFFLAGS读取 或 设置 设备的 活动标志字. ifr_flags 包含 下列值 的 屏蔽位: 设备标志IFF_UP接口正在运行.IFF_BROADCAST有效的广播地址集.IFF_DEBUG内部调试标志.IFF_LOOPBACK这是自环接口.IFF_POINTOPOINT这是点到点的链路接口.IFF_RUNNING资源已分配.IFF_NOARP无arp协议, 没有设置第二层目的地址.IFF_PROMISC接口为杂凑(promiscuous)模式.IFF_NOTRAILERS避免使用trailer .IFF_ALLMULTI接收所有组播(multicast)报文.IFF_MASTER主负载平衡群(bundle).IFF_SLAVE从负载平衡群(bundle).IFF_MULTICAST支持组播(multicast).IFF_PORTSEL可以通过ifmap选择介质(media)类型.IFF_AUTOMEDIA自动选择介质.IFF_DYNAMIC接口关闭时丢弃地址. 设置 活动标志字 是 特权操作, 但是 任何进程 都可以 读取 标志字. SIOCGIFMETRIC, SIOCSIFMETRIC使用 ifr_metric 读取 或 设置 设备的 metric 值. 该功能 目前 还没有 实现. 读取操作 使 ifr_metric 置 0, 而 设置操作 则 返回 EOPNOTSUPP.SIOCGIFMTU, SIOCSIFMTU使用 ifr_mtu 读取 或 设置 设备的 MTU(最大传输单元). 设置 MTU 是 特权操作. 过小的 MTU 可能 导致 内核 崩溃.SIOCGIFHWADDR, SIOCSIFHWADDR使用 ifr_hwaddr 读取 或 设置 设备的 硬件地址. 设置 硬件地址 是 特权操作.SIOCSIFHWBROADCAST使用 ifr_hwaddr 读取 或 设置 设备的 硬件广播地址. 这是个 特权操作.SIOCGIFMAP, SIOCSIFMAP使用 ifr_map 读取 或 设置 接口的 硬件参数. 设置 这个参数 是 特权操作. struct ifmap { unsigned long mem_start; unsigned long mem_end; unsigned short base_addr; unsigned char irq; unsigned char dma; unsigned char port; }; 对 ifmap 结构 的 解释 取决于 设备驱动程序 和 体系结构. SIOCADDMULTI, SIOCDELMULTI使用 ifr_hwaddr 在 设备的 链路层 组播过滤器 (multicase filter) 中 添加 或 删除 地址. 这些是 特权操作. 参看 packet(7).SIOCGIFTXQLEN, SIOCSIFTXQLEN使用 ifr_qlen 读取 或 设置 设备的 传输队列长度. 设置 传输队列长度 是 特权操作.SIOCSIFNAME把 ifr_ifindex 中 指定的 接口名字 改成 ifr_newname. 这是个 特权操作.SIOCGIFCONF返回 接口地址(传输层) 列表. 出于 兼容性, 目前 只代表 AF_INET 地址. 用户 传送 一个 ifconf 结构 作为 ioctl 的 参数. 其中 ifc_req 包含 一个 指针 指向 ifreq 结构数组, 他的 长度 以字节 为单位 存放在 ifc_len 中. 内核 用 所有 当前的 L3(第三层?) 接口地址 填充 ifreqs, 这些 接口 正在 运行: ifr_name 存放 接口名字 (eth0:1等), ifr_addr 存放 地址. 内核 在 ifc_len 中 返回 实际长度; 如果 他 等于 初始长度, 表示 溢出了, 用户 应该 换一个 大些的 缓冲区 重试 一下. 没有 发生 错误时 ioctl 返回 0, 否则 返回 -1, 溢出 不算 错误. 转载于:https://www.cnblogs.com/p2liu/archive/2010/08/06/6048827.html