ioctl操作
 
传统上ioctl函数是用于那些普遍使用,但不适合归入其他类别的任何特性的系统接 口。Posix去掉了ioctl,它通过
创建特殊的其功能已被Posix标准化的包裹函数来代替ioctl。这一章介绍和网络 编程有关的ioctl操作。
 
1. ioctl函数
 
int ioctl(int d, int request, ...);
 
和网络有关的ioctl请求有6类:
套接口操作
文件操作
接口操作
ARP高速缓存操作
路由表操作
流系统
2. 套接口操作
 
类别 请求 描述 数据类型
套接口 SIOCATMASK 在带外标志上吗 int
  SIOCSPGRP 设置套接口的进程ID和进程组ID int
  SIOCGPGPR 获取套接口的进程ID和进程组ID int
 
SIOCATMASK: 如果套接口的读指针在带外标志上,则通过第三个参数指向的整数返回一个非零值,否则返回零。
3. 文件操作
 
类别 请求 描述 数据类型
文件操作 FIONBIO 设置/清除非阻塞标志 int
  FIOASYNC 设置/清除异步I/O标志 int
  FIONREAD 获取接收缓冲区中数据的字节数 int
  FIOSETOWN 设置文件的进程ID或进程组ID int
  FIOGETOWN 获取文件的进程ID或进程组ID int
 
FIONBIO: 这个请求和用fcntl的F_SETFL命令设置和清除O_NONBLOCK标志效果相同。
 
4. 接口配置
类别 请求 描述 数据类型
接口 SIOCGIFCONF 获取所有接口的列表 struct ifconf
  SIOCSIFADDR 设置接口地址 struct ifreq
  SIOCGIFADDR 获取接口地址 struct ifreq
  SIOCSIFFLAGS 设置接口标志 struct ifreq
  SIOCGIFFLAGS 获取接口标志 struct ifreq
  SIOCSIFDSTADDR 设置点对点地址 struct ifreq
  SIOCGIFDSTADDR 获取点对点地址 struct ifreq
  SIOCGIFBRDADDR 获取广播地址 struct ifreq
  SIOCSIFBRDADDR 设置广播地址 struct ifreq
  SIOCGIFNETMASK 获取子网掩码 struct ifreq
  SIOCSIFNETMASK 设置子网掩码 struct ifreq
  SIOCGIFMETRIC 获取接口的测度(metric) struct ifreq
  SIOCSIFMETRIC 设置接口的测度(metric) struct ifreq
  SIOCxxx    
 
 
 
5. ARP
 
类别 请求 描述 数据类型
ARP SIOCSARP 创建/修改ARP项 struct arpreq
  SIOCGARP 获取ARP项 struct arpreq
  SIOCDARP 删除ARP项 struct arpreq
 
 
6. 路由
 
类别 请求 描述 数据类型
路由 SIOCADDRT 增加路径 struct rtentry
  SIOCDELRT 删除路径 struct rtentry
=====================================================================================================

套接口ioctl函数

#include <unistd.h>
int ioctl(int fd, int request, … /* void *arg */ );
返回:成功返回0,出错返回-1。

第三个参数总是一个指针,但指针的类型依赖于request。

ioctl和网络有关的请求可分为如下6类:

类别 request 描述 数据类型
       
套接口 SIOCATMARK 在带外标志上吗 int
  SIOCSPGRP 设置套接口的进程ID或进程组ID int
  SIOCGPGRP 获取套接口的进程ID或进程组ID int
       
文件 FIONBIO 设置/清除非阻塞标志 int
  FIOASYNC 设置/清除异步I/O标志 int
  FIONREAD 获取接收缓冲区中的字节数 int
  FIOSETOWN 设置文件的进程ID或进程组ID int
  FIOGETOWN 获取文件的进程ID或进程组ID int
       
接口 SIOCGIFCONF 获取所有接口的列表 struct ifconf
  SIOCSIFADDR 设置接口地址 struct ifreq
  SIOCGIFADDR 获取接口地址 struct ifreq
  SIOCSIFFLAGS 设置接口标志 struct ifreq
  SIOCGIFFLAGS 获取接口标志 struct ifreq
  SIOCSIFDSTADDR 设置点到点地址 struct ifreq
  SIOCGIFDSTADDR 获取点到点地址 struct ifreq
  SIOCGIFBRDADDR   获取广播地址 struct ifreq
  SIOCSIFBRDADDR 设置广播地址 struct ifreq
  SIOCGIFNETMASK 获取子网掩码 struct ifreq
  SIOCSIFNETMASK 设置子网掩码 struct ifreq
  SIOCGIFMETRIC 获取接口的测度(metric) struct ifreq
  SIOCSIFMETRIC 设置接口的测度(metric) struct ifreq
  SIOCxxx (有很多,依赖于实现)  
       
ARP SIOCSARP 创建/修改ARP项 struct arpreq
  SIOCGARP 获取ARP项 struct arpreq
  SIOCDARP 删除ARP项 struct arpreq
       
路由 SIOCADDRT 增加路径 struct rtentry
  SIOCDELRT 删除路径 struct rtentry
       
 

(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:从内核中获取系统中配置的所有接口。它使用了结构ifconf,ifconf又使用了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结构。

一个实现获取所有接口的程序,可参见unpv12e:lib/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.
SIOCGIFFLAGSSIOCSIFFLAGS
读取 或 设置 设备的 活动标志字. 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 接口关闭时丢弃地址.

设置 活动标志字 是 特权操作, 但是 任何进程 都可以 读取 标志字.

SIOCGIFMETRICSIOCSIFMETRIC
使用 ifr_metric 读取 或 设置 设备的 metric 值. 该功能 目前 还没有 实现. 读取操作 使 ifr_metric 置 0, 而 设置操作 则 返回 EOPNOTSUPP.
SIOCGIFMTUSIOCSIFMTU
使用 ifr_mtu 读取 或 设置 设备的 MTU(最大传输单元). 设置 MTU 是 特权操作. 过小的 MTU 可能 导致 内核 崩溃.
SIOCGIFHWADDRSIOCSIFHWADDR
使用 ifr_hwaddr 读取 或 设置 设备的 硬件地址. 设置 硬件地址 是 特权操作.
SIOCSIFHWBROADCAST
使用 ifr_hwaddr 读取 或 设置 设备的 硬件广播地址. 这是个 特权操作.
SIOCGIFMAPSIOCSIFMAP
使用 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 结构 的 解释 取决于 设备驱动程序 和 体系结构.

SIOCADDMULTISIOCDELMULTI
使用 ifr_hwaddr 在 设备的 链路层 组播过滤器 (multicase filter) 中 添加 或 删除 地址. 这些是 特权操作. 参看 packet(7).
SIOCGIFTXQLENSIOCSIFTXQLEN
使用 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, 溢出 不算 错误.

(十五)ioctl、ifreq、ifconf的更多相关文章

  1. 学习笔记:CentOS7学习之十五: RAID磁盘阵列的原理与搭建

    目录 学习笔记:CentOS7学习之十五: RAID磁盘阵列的原理与搭建 14.1 RAID概念 14.1.1 RAID几种常见的类型 14.1.2 RAID-0工作原理 14.1.3 RAID-1工 ...

  2. 我的MYSQL学习心得(十五) 日志

    我的MYSQL学习心得(十五) 日志 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ...

  3. Bootstrap <基础二十五>警告(Alerts)

    警告(Alerts)以及 Bootstrap 所提供的用于警告的 class.警告(Alerts)向用户提供了一种定义消息样式的方式.它们为典型的用户操作提供了上下文信息反馈. 您可以为警告框添加一个 ...

  4. Bootstrap<基础十五> 输入框组

    Bootstrap 支持的另一个特性,输入框组.输入框组扩展自 表单控件.使用输入框组,可以很容易地向基于文本的输入框添加作为前缀和后缀的文本或按钮. 通过向输入域添加前缀和后缀的内容,您可以向用户输 ...

  5. 解剖SQLSERVER 第十五篇 SQLSERVER存储过程的源文本存放在哪里?(译)

    解剖SQLSERVER 第十五篇  SQLSERVER存储过程的源文本存放在哪里?(译) http://improve.dk/where-does-sql-server-store-the-sourc ...

  6. Senparc.Weixin.MP SDK 微信公众平台开发教程(十五):消息加密

    前不久,微信的企业号使用了强制的消息加密方式,随后公众号也加入了可选的消息加密选项.目前企业号和公众号的加密方式是一致的(格式会有少许差别). 加密设置 进入公众号后台的“开发者中心”,我们可以看到U ...

  7. 十五个常用的jquery代码段【转】

    好的文章顶一个 回到顶部按钮 通过使用 jQuery 中的 animate 和 scrollTop 方法,你无需插件便可创建一个简单地回到顶部动画: 1 // Back to top 2 $('a.t ...

  8. 十五个常用的jquery代码段

    十五个常用的jquery代码段 回到顶部按钮 通过使用 jQuery 中的 animate 和 scrollTop 方法,你无需插件便可创建一个简单地回到顶部动画: 1 // Back to top ...

  9. 淘宝(阿里百川)手机客户端开发日记第十五篇 JSON解析(四)

    解析一个从淘宝传递的JSON (大家如有兴趣可以测试下):{ "tae_item_detail_get_response": { "data": { " ...

随机推荐

  1. ios下fixed回复框bug的解决方案

    前几天做一个移动端的页面,要加个像微信那样附着在底部的回复框,按照做PC端网页的思路,首先是用fixed,在安卓上测了一下是好的,结果到朋友的iphone6p上就不行了,点击输入框之后它总会跳到屏幕中 ...

  2. 【js跨域】js实现跨域访问的几种方式

    这里说的js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据.只要协议.域名.端口有任何一个不同,都被 ...

  3. 2.MongoDB数据库简介

    1).简介 MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案. mongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系 ...

  4. ruby调试/练习时的小技巧

    必备工具 irb 查祖先 1.9.3-p545 :023 > String.ancestors => [String, Comparable, Object, Kernel, BasicO ...

  5. MVC Core

    .NET Core 1.1 发布 文档下载资源汇总 https://www.microsoft.com/net/core#windowsvs2015 https://docs.microsoft.co ...

  6. ScrollView

    在程序设计中,有时我们需要实现自动滚屏或根据选择直接滚动到指定的位置的功能.这里用到的主要组件就是滚动视图(ScrollView). ---------- 那么使用ScrollView如何实现布局自动 ...

  7. 巧用margin/padding的百分比值实现高度自适应(多用于占位,避免闪烁)

    本文依赖于一个基础却又容易混淆的css知识点:当margin/padding取形式为百分比的值时,无论是left/right,还是top/bottom,都是以父元素的width为参照物的!也许你会说, ...

  8. ASP.NET MVC5----基本用法

    由于之前在项目中也使用MVC进行开发,但是具体是那个版本就不是很清楚了,但是我觉得大体的思想是相同的,只是版本高的在版本低的基础上增加了一些更加方便操作的东西.下面是我学习ASP.NET MVC5高级 ...

  9. mysql 修改密码

    安装完成后,默认本地登录超级管理员root,密码为空连接服务后(先停止服务,在wamp中运行mysql控制台enterpass:直接回车),执行set password for root@localh ...

  10. css 水平垂直居中

    主要是垂直居中有点麻烦,以下代码可以实现,先记下来: <style type="text/css"> div{ border:1px solid #ccc; heigh ...