ioctl操作

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设置/清除非阻塞标志int

FIOASYNC设置/清除异步I/O标志int

FIONREAD获取接收缓冲区中数据的字节数int

FIOSETOWN设置文件的进程ID或进程组IDint

FIOGETOWN获取文件的进程ID或进程组IDint
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
类别请求描述数据类型
ARPSIOCSARP创建/修改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或进程组IDint

SIOCGPGRP获取套接口的进程ID或进程组IDint




文件FIONBIO设置/清除非阻塞标志int

FIOASYNC设置/清除异步I/O标志int

FIONREAD获取接收缓冲区中的字节数int

FIOSETOWN设置文件的进程ID或进程组IDint

FIOGETOWN获取文件的进程ID或进程组IDint




接口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(有很多,依赖于实现)




ARPSIOCSARP创建/修改ARP项struct arpreq

SIOCGARP获取ARP项struct arpreq

SIOCDARP删除ARP项struct arpreq




路由SIOCADDRT增加路径struct rtentry

SIOCDELRT删除路径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:从内核中获取系统中配置的所有接口。它使用了结构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, 溢出 不算 错误.

转载于:https://www.cnblogs.com/p2liu/archive/2010/08/06/6048827.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/475903.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java用栈处理四则运算_Java 用栈处理四则运算

import java.util.Arrays;import java.util.HashMap;import java.util.Map;import java.util.Stack;import java.util.regex.Matcher;import java.util.regex.Pattern;/*** 目前只能做简单的四则运算&#xff0c;不支持浮点数和其他符号&#xff0c;不支持多线程* 计算步骤&…

LeetCode 846. 一手顺子(map)

1. 题目 爱丽丝有一手&#xff08;hand&#xff09;由整数数组给定的牌。 现在她想把牌重新排列成组&#xff0c;使得每个组的大小都是 W&#xff0c;且由 W 张连续的牌组成。 如果她可以完成分组就返回 true&#xff0c;否则返回 false。 示例 1&#xff1a; 输入&#xf…

25 To Life

《25 To Life 》 too late for the other side 现在回头为时已晚 caught in a change 由于一次变故 25 to life 25岁时,即决定了一生 too late for the other side 现在回头为时已晚 caught in a change 由于一次变故 25 to life 25岁时,即决定了一生 …

多线程 流水线 java_Java Lock锁多线程中实现流水线任务

下面程序代码通过使用Lock锁执行简单的流水线任务&#xff1a;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;/*** author lzq* data 2020/4/29 0029 - 下午 9:48*/public class Test…

LeetCode 962. 最大宽度坡(单调栈)

1. 题目 给定一个整数数组 A&#xff0c;坡是元组 (i, j)&#xff0c;其中 i < j 且 A[i] < A[j]。这样的坡的宽度为 j - i。 找出 A 中的坡的最大宽度&#xff0c;如果不存在&#xff0c;返回 0 。 示例 1&#xff1a; 输入&#xff1a;[6,0,8,2,1,5] 输出&#xff1…

java 加载资源文件

ClassLoader提供了两个方法用于从装载的类路径中取得资源&#xff1a; public URL getResource(String name); public InputStream getResourceAsStream(String name);这里name是资源的类路径&#xff0c;它是相对与“/”根路径下的位置。getResource得到的是一个URL对象来定位…

Java用链表写图书管理_C语言链表实现图书管理系统

之前参照网上的资料用链表实现了图书管理系统&#xff0c;包括简单的增删改查功能以及借书还书功能&#xff0c;我是VC6.0下写的一个控制台程序&#xff0c;格式参照的网上的。在动手编码之前&#xff0c;你需要理清自己的思路。首先&#xff0c;需要确定图书馆里系统中主要有那…

【Kaggle】Intermediate Machine Learning(缺失值+文字特征处理)

文章目录1. Introduction2. Missing Values 缺失值处理3. Categorical Variables 文字变量处理from https://www.kaggle.com/learn/intermediate-machine-learning下一篇 &#xff1a;【Kaggle】Intermediate Machine Learning&#xff08;管道交叉验证&#xff09; 1. Intro…

VB6调用API打开目标文件所在文件夹且选中目标文件

Option Explicit 模块名称: mOpenFolderAndSetFileFocus 作者: 唐细刚 时间: 2010-08-22 功能: VB6调用API打开目标文件所在文件夹且选中目标文件 注&#xff1a; 由于调用 Explorer.exe /select 方式会使系统产生多余的 Explorer.exe 进程 所以还是API来实现较好…

python 保存文件 吃内存_孤荷凌寒自学python第三十七天python的文件与内存变量之间的序列化与反序列化...

孤荷凌寒自学python第三十七天python的文件与内存变量之间的序列化与反序列化(完整学习过程屏幕记录视频地址在文末&#xff0c;手写笔记在文末)一、什么是序列化与反序列化序列化是指将内存中的数据进行指定规则的格式梳理&#xff0c;使之方便按一定格式保存到文件中。我的理…

【Kaggle】Intermediate Machine Learning(管道+交叉验证)

文章目录4. Pipelines 管道5. Cross-Validation 交叉验证上一篇&#xff1a;【Kaggle】Intermediate Machine Learning&#xff08;缺失值文字特征处理&#xff09; 下一篇&#xff1a;【Kaggle】Intermediate Machine Learning&#xff08;XGBoost Data Leakage&#xff09; …

ASP.NET2.0导出Word文档(C#导出DOC)

在网络上看到很多关于ASP.NET导出DOC文档的例子&#xff0c;有的干脆就直接将html页面不做任何处理直接导出为DOC文件&#xff0c;但是那样会有很多错误&#xff0c;例如将某些控件显示为图片。我还曾经见过微软为中国某个大公司制作的一个XX系统&#xff0c;导出的DOC文件实际…

java todo error_java.sql.SQLException: sql injection violation, syntax error: TODO UNIQUE unique

wenshao 你好&#xff0c;想跟你请教个问题&#xff1a;我是在用activiti工作流的时候 初始化生成流程表产生了下面的问题工作流引擎代码&#xff1a;ProcessEngineConfiguration config ProcessEngineConfiguration.createStandaloneProcessEngineConfiguration();config.se…

ASP VBScript 函数速查表

VBScript函数 功能说明 例子 Abs &#xff08;数值&#xff09;绝对值。一个数字的绝对值是它的正值。空字符串 (null) 的绝对值&#xff0c;也是空字符串。未初始化的变数&#xff0c;其绝对为 0例子&#xff1a;ABS(-2000) 结果&#xff1a;2000Array &#xff08;以逗点分…

LeetCode 201. 数字范围按位与(位运算)

文章目录1. 题目2. 解题2.1 按位查找02.2 两数直接都往右移动&#xff0c;直到相等1. 题目 给定范围 [m, n]&#xff0c;其中 0 < m < n < 2147483647&#xff0c;返回此范围内所有数字的按位与&#xff08;包含 m, n 两端点&#xff09;。 示例 1: 输入: [5,7] 输…

编php矩阵求和,PHP二维数组如何求和?

PHP二维数组求和的方法&#xff1a;1、使用array_sum和array_map函数求和1)、PHP7.2以下可用<?php $arr array(0>array(id>1,tol>10),1>array(id>3,tol>12),2>array(id>8,tol>5));//输出tol值的和echo array_sum(array_map(create_function($v…

LeetCode 1311. 获取你好友已观看的视频(BFS+哈希map+vector排序)

1. 题目 有 n 个人&#xff0c;每个人都有一个 0 到 n-1 的唯一 id 。 给你数组 watchedVideos 和 friends &#xff0c;其中 watchedVideos[i] 和 friends[i] 分别表示 id i 的人观看过的视频列表和他的好友列表。 Level 1 的视频包含所有你好友观看过的视频&#xff0c; …

发布ASP.NET程序至IIS7

以前一直和IIS5打交道&#xff0c;后来系统升级到WIN7,自然的就用上了IIS7了&#xff0c;不过因为对IIS7服务器没有系统的了解&#xff0c;所以在自己机子上测试发布网站时&#xff0c;总是遇到各种各样的问题&#xff0c;当时就放弃了&#xff0c;准备有时间再研究的&#xff…

php请求来源,php验证请求页面来源

php教程验证请求页面来源if( $_server[http_x_requested_with] xmlhttprequest ) {echo ajax;} else {echo normal;}jquery内部实现ajax的时候&#xff0c;已经加入了标识jquery源码中是这样的&#xff1a;xhr.setrequestheader("x-requested-with", "xmlhttpr…

LeetCode 1319. 连通网络的操作次数(BFS/DFS/并查集)

文章目录1. 题目2. 解题2.1 BFS2.2 DFS2.3 并查集1. 题目 用以太网线缆将 n 台计算机连接成一个网络&#xff0c;计算机的编号从 0 到 n-1。 线缆用 connections 表示&#xff0c;其中 connections[i] [a, b] 连接了计算机 a 和 b。 网络中的任何一台计算机都可以通过网络直…