ioctl 套接字控制操作

用途

执行与网络相关的控制操作。

语法

#include <sys/ioctl.h>

int ioctl (fd,  cmd, .../* arg */) 
int  fd;
int  cmd; 
int ...  /* arg */

描述

套接字 ioctl 命令执行各种与网络相关的控制。 fd 参数是套接字描述符。 对于非套接字描述符,未指定此调用所执行的函数。

cmd 自变量和可选的第三个自变量 (具有不同的类型) 将传递到套接字 ioctl 函数并由其解释,以执行用户指定的相应控制操作。

套接字 ioctl 控制操作可以在以下控制操作类别中:

参数

描述
fd 打开引用通过使用套接字或接受调用创建的套接字的文件描述符。
命令 选择要执行的控制功能。
.../ * arg */ 表示请求的功能所需的信息。 arg 的类型取决于特定控制请求,但它是特定于套接字的数据结构的整数或指针。

套接字控制操作

以下 ioctl 命令对套接字执行操作:
ioctl 命令 描述
SIOCATMARK 确定读指针是否指向 DataStream中的逻辑标记。 逻辑标记指示发送频带外数据的点。
ioctl(fd, SIOCATMARK,&atmark);
int atmark;
如果 atmark 在返回时设置为 1 ,那么读取指针将指向标记,下一次读取将返回标记后的数据。 如果 atmark 在返回时设置为 0 (假定 DataStream上存在频带外数据) ,那么下一次读取将返回在频带外标记之前发送的数据。
注: 频带外数据是逻辑上独立的数据通道,独立于正常数据传递给用户; 此外,由于需要立即注意,还会发送信号。 Ctrl-C 字符是一个示例。

SIOCSPGRP

SIOCGPGRP

SIOCSPGRP 设置套接字的进程组信息。 SIOCGPGRP 获取与套接字关联的进程组标识。
ioctl (fd, cmd, (int)&pgrp);
int  pgrp;
命令
设置为 SIOCSPGRP 或 SIOCGPGRP。
pgrp
指定套接字的进程组标识。

路由表控制操作

以下 ioctl 命令对内核路由表执行操作:
ioctl 命令 描述

SIOCADDRT

SIOCDELRT

SIOCADDRT 在路由表中添加路由条目。 SIOCDELRT 从路由表中删除路由条目。
ioctl(fd, cmd, (caddr_t)&route);
struct ortentry route;
命令
设置为 SIOCADDRT 或 SIOCDELRT。
路由条目信息在 ortentry 结构中传递。
SIOUPDROUTE 使用 ifreq 结构中传递的信息更新路由表。
ioctl (fd, SIOUPDROUTE, (caddr_t)&ifr);
struct ifreq  ifr;

ARP 表控制操作

以下 ioctl 命令对内核 ARP 表执行操作。 必须包含 net/if_arp.h 头文件。
ioctl 命令 描述

SIOCSARP

SIOCDARP

SIOCGARP

SIOCSARP 在 ARP 表中添加或修改 ARP 条目。 SIOCDARP 从 ARP 表中删除 ARP 条目。 SIOCGARP 从 ARP 表中获取 ARP 条目。
ioctl(fd, cmd, (caddr_t)&ar);
struct arpreq ar;
命令
设置为 SIOCSARP , SIOCDARP 或 SIOCGARP。

ARP 条目信息在 arpreq 结构中传递。 如果 ar.if Type = IFT_IB 且命令为 SIOCDARP ,那么将删除 InfiniBand (IB) ARP 条目。

全局网络参数控制操作

以下 ioctl 命令作为全局网络参数运行:
ioctl 命令 描述

SIOCSNETOPT

SIOCGNETOPT

SIOCDNETOPT

SIOCGNETOPT1

SIOCSNETOPT 设置网络选项的值。 SIOCGNETOPT 获取网络选项的值。 SIOCDNETOPT 设置网络选项的缺省值。
ioctl(fd, cmd, (caddr_t)&oreq);
struct optreq oreq;
命令
设置为 SIOCSNETOPT , SIOCGNETOPT 或 SIOCDNETOPT。
网络选项值存储在 optreq 结构中。
SIOCGNETOPT1 获取网络选项的当前值,缺省值和范围。
ioctl(fd, SIOCGNETOPT1, (caddr_t)&oreq);
struct optreq1 oreq;
网络选项信息在返回时存储在 optreq1 结构中。 optreqoptreq1 结构在 net/netopt.h中定义。

SIOCGNMTUS

西奥克特姆图斯

SIOCADDMTU

SIOCDELMTU

SIOCGNMTUS 获取公共 MTU 列表中维护的 MTU 数。 SIOCADDMTU 在公共 MTU 列表中添加 MTU。 SIOCDELMTU 从公共 MTU 列表中删除 MTU。
ioctl(fd, cmd, (caddr_t)&nmtus);
int nmtus;
命令
设置为 SIOCGNMTUS , SIOCADDMTU 或 SIOCDELMTU。
SIOCGETMTUS 获取公共 MTU 列表中维护的 MTU。
ioctl(fd, SIOCGETMTUS, (caddr_t)&gm);
struct get_mtus gm;
get_mtus 结构在 netinet/in.h中定义。

接口控制操作

以下 ioctl 命令对接口执行操作。 必须包含 net/if.h 头文件。
ioctl 命令 描述

SIOCSIFADDR

SIOCDIFADDR

SIOCSIFADDR 设置接口地址。 SIOCDIFADDR 删除接口地址。 接口地址在 ifr.ifr_addr 字段中指定。 SIOCGIFADDR 获取接口地址。 该地址在 ifr.ifr_addr 字段中返回。
ioctl(fd, cmd, (caddr_t)&ifr, sizeof(struct ifreq));
struct ifreq ifr;
命令
设置为 SIOCSIFADDR 或 SIOCDIFADDR。

SIOCAIFADDR

SIOCAIFADDR 添加接口地址。 接口名称在 ifr.ifra_name 字段中指定。 别名 IP 地址在 theifr.ifra_addr 字段中指定。 可以在 ifr.ifra_broadaddr 字段中指定别名 IP 广播地址,也可以在 ifr.ifra_mask中指定别名 IP 网络掩码。
ioctl(fd, cmd, (caddr_t)&ifr, sizeof(struct ifaliasreq));
struct ifaliasreq ifr;
命令
设置为 SIOCAIFADDR
SIOCGIFADDRS 获取与接口关联的地址的列表。
ioctl (fd, SIOCGIFADDRS, (caddr_t)ifaddrsp);
struct ifreqaddrs  *ifaddrsp;
接口名称在 ifaddrsp-> ifr_name 字段中传递。 与接口关联的地址将在返回时存储在 ifaddrsp->ifrasu 数组中。
注: ifreqaddrs 结构包含用于仅存储一个 sockaddr_in/sockaddr_in6 结构 (一个 sockaddr_in/sockaddr_in6 元素的数组) 的空间。 要获取与接口关联的 n 地址, ioctl 命令的调用者必须为 {sizeof (struct ifreqaddrs) + (n * sizeof (struct sockaddr_in)} 字节分配空间。

SIOCSIFDSTADDR

SIOCGIFDSTADDR

SIOCSIFDSTADDR 设置 ifr.ifr_dstaddr 字段中指定的接口的点到点地址。 SIOCGIFDSTADDR 获取与接口关联的点到点地址。 地址在返回时存储在 ifr.ifr_dstaddr 字段中。
ioctl(fd, cmd, (caddr_t)&ifr, sizeof(struct ifreq));
struct ifreq ifr;
命令
设置为 SIOCSIFDSTADDR 或 SIOCGIFDSTADDR。

Siocsifnetmask

SIOCGIFNETMASK

SIOCSIFNETMASK 设置在 ifr.ifr_addr 字段中指定的接口网络掩码。 SIOCGIFNETMASK 获取接口网络掩码。
ioctl(fd, cmd, (caddr_t)&ifr, sizeof(struct ifreq));
struct ifreq ifr;
命令
设置为 SIOCSIFNETMASK 或 SIOCGIFNETMASK。

SIOCSIFBRDADDR

SIOCGIFBRDADDR

SIOCSIFBRDADDR 设置在 ifr.ifr_broadaddr 字段中指定的接口广播地址。 SIOCGIFBRDADDR 获取接口广播地址。 广播地址位于 ifr.ifr_broadaddr 字段中。
ioctl(fd, cmd, (caddr_t)&ifr, sizeof(struct ifreq));
struct ifreq ifr;
命令
设置为 SIOCSIFBRDADDR 或 SIOCGIFBRDADDR。
SIOCGSIZIFCONF 获取获取 SIOCGIFCONF 返回的所有接口的配置信息所需的内存大小。
ioctl(fd, cmd, (caddr_t)&ifconfsize);
int ifconfsize;
SIOCGIFCONF 返回系统上配置的所有接口的配置信息。
ioctl(fd, SIOCGIFCONF, (caddr_t)&ifc);
struct ifconf ifc;
配置信息将在 ifc.ifc_req 字段指向的 ifreq 结构列表中返回,每个接口一个 ifreq 结构。
注: ioctl 命令的调用者必须分配足够的空间来存储配置信息 (作为系统上配置的所有接口的 ifreq 结构列表返回)。 例如,如果在系统上配置了 n 接口,那么 ifc.ifc_req 必须指向 {n * sizeof (struct ifreq)} 分配的空间字节。
注: 或者, SIOCGSIZIFCONF ioctl 命令可用于此目的。

SIOCSIFFLAGS

SIOCGIFFLAGS

SIOCSIFFLAGS 设置接口标志。 SIOCGIFFLAGS 获取接口标志。
ioctl(fd, cmd, (caddr_t)&ifr);
struct ifreq ifr;
请参阅 /usr/include/net/if.h 以获取由 IFF_xxx表示的接口标志。
注: 不能使用 ioctl 更改 IFF_BROADCASTIFF_POINTTOPOINTIFF_SIMPLEXIFF_RUNNINGIFF_OACTIVEIFF_MULTICAST 标志。

SIOCSIFMETRIC

SIOCGIFMETRIC

SIOCSIFMETRIC 设置在 ifr.ifr_metric 字段中指定的接口度量。 SIOCGIFMETRIC 获取接口度量。 接口度量值在返回时放置在 ifr.ifr_metric 字段中。
ioctl(fd, cmd, (caddr_t)&ifr);
struct ifreq ifr;
命令
设置为 SIOCSIFMETRIC 或 SIOCGIFMETRIC。

SIOCSIFSUB陈

SIOCGIFSUB陈

SIOCSIFSUB陈设置在 ifr.ifr_flags 字段中指定的子通道地址。 SIOCGIFSUB陈在 ifr.ifr_flags 字段中获取子通道地址。
ioctl(fd, SIOCSIFSUBCHAN, (caddr_t)&ifr);
struct ifreq ifr;

SIOCSIFOPTIONS

SIOCGIF 选项

SIOCSIFOPTIONS 设置接口选项。 SIOCGIFOPTIONS 获取接口选项。
ioctl(fd, SIOCSIFOPTIONS, (caddr_t)&ifr);
struct ifreq ifr;
接口选项存储在 ifreq 结构的 ifr_flags 字段中。 请参阅 /usr/include/net/if.h 文件,以获取由 IFO_xxx表示的接口选项列表。
ioctl 命令 描述

西奥卡多

西奥克德尔多

SIOCADDMULTI 将地址添加到接口的多点广播地址列表中。 SIOCDELMULTI 从接口的多点广播地址列表中删除多点广播地址。
ioctl(fd, cmd, (caddr_t)&ifr);
struct ifreq ifr;
命令
设置为 SIOCADDMULTI 或 SIOCDELMULTI。
多点广播地址信息在 ifr_addr 结构中指定。
SIOCGETVIFCNT 获取虚拟接口的包计数信息。 此信息在 sioc_vif_req 结构中指定。
ioctl (fd, SIOCGETVIFCNT, (caddr_t)&v_req);
struct sioc_vif_req  v_req;
SIOCGETSGCNT 获取指定源组的包计数信息。 此信息在返回时存储在 sioc_sg_req 结构中。
ioctl(fd, SIOCGETSGCNT, (caddr_t)&v_req);
struct sioc_sg_req v_req;

SIOCSIFMTU

SIOCGIFMTU

SIOCSIFMTU 设置接口最大传输单元 (MTU)。 SIOCGIFMTU 获取接口 MTU。
ioctl(fd, cmd, (caddr_t)&ifr);
struct ifreq ifr;
MTU 值存储在 ifr.ifr_mtu 字段中。
注: MTU 的有效值范围因接口而异,并且取决于接口类型。

SIOCIFATTACH

SIOCIFDETACH

SIOCIFATTACH 连接接口。 这将初始化并在网络接口列表中添加接口。 SIOCIFDETACH 拆离接口广播地址。 这将从网络接口列表中除去接口。 接口名称在 ifr.ifr_name 字段中指定。
ioctl(fd, cmd, (caddr_t)&ifr);
struct ifreq ifr;

SIOCSIFGIDLIST

SIOCGIFGIDLIST

SIOCSIFGIDLIST 将 ifrg.ifrg_gidlist 字段中指定的组标识列表添加或删除到 gidlist 接口。 接口名称在 ifrg.ifrg_name 字段中指定。 在 ifrg.ifrg_gidlist 字段中指定的操作码 ADD_GRP/DEL_GRP指示指定的组标识列表是必须添加到 gidlist 接口还是从该接口中删除。 SIOCGIFGIDLIST 获取与接口关联的组标识的列表。 组标识将在返回时放在 ifrg.ifrg_gidlist 字段中。
ioctl(fd, cmd, (caddr_t)&ifrg);
struct ifgidreq ifrg;

SIOCIF_ATM_UBR

siocif_atm_snmparp

siocif_atm_dumparp

Siocif_atm_idle

SIOCIF_ATM_SVC

Siocif_ATM_DARP

Siocif_ATM_GARP

Siocif_ATM_SARP

SIOCIF_ATM_UBR 设置 ATM 接口的 UBR 速率。 SIOCIF_ATM_SNMPARP 获取 SNMP ATM ARP 条目。 SIOCIF_ATM_DUMPARP 获取指定数目的 ATM ARP 条目。 SIOCIF_ATM_DARP 从 ARP 表中删除 ATM ARP 条目。 SIOCIF_ATM_GARP 获取 ARP 表的 ATM ARP 条目。 SIOCIF_ATM_SARP 添加 ATM ARP 条目。 ARP 信息在 atm_arpreq 结构中指定。 SIOCIF_ATM_SVC 指定此接口是否支持永久虚拟电路 (PVC) 和交换虚拟电路 (SVC) 类型的虚拟连接。 它还根据 ifatm_svc_arg 结构中设置的标志指定此接口是此逻辑 IP 子网 (LIS) 的 ARP 客户机还是 ARP 服务器。 SIOCIF_ATM_IDLE 指定接口上的空闲时间限制。

SIOCSISNO

SIOCGISNO

SIOCSISNO 为接口设置特定于接口的网络选项。 SIOCGISNO 获取与接口关联的特定于接口的网络选项。
ioctl(fd, cmd, (caddr_t)&ifr);
struct ifreq ifr;
命令
设置为 SIOCSISNO 或 SIOCGISNO。
特定于接口的网络选项存储在 ifr.ifr_isno 结构中。 请参阅 /usr/include/net/if.h 文件,以获取由 ISNO_xxx表示的特定于接口的网络选项的列表。
Siocgifbaudrate 获取 ifr_baudrate 字段中接口波特率的值。
ioctl(fd, SIOCGIFBAUDRATE, (caddr_t)&ifr);
struct ifreq ifr;
波特率存储在 ifr.ifr_baudrate 字段中。

西奥卡迪夫维帕

西奥克代利维帕

SIOCLISTIFVIPA

SIOCADDIFVIPA 将 ifrv.ifrv_ifname 指向的接口的指定列表与 ifrv.ifrv_name指定的虚拟接口相关联。 此操作会将这些接口上所有传出包的源地址设置为虚拟接口地址。 SIOCDELIFVIPA 通过使用 SIOCADDIFVIPA 除去由 ifrv.ifrv_ifname 指向并与 ifrv.ifrv_name指定的虚拟接口相关联的指定接口的列表。 SIOCLISTIFVIPA 列出与 ifrv.ifrv_name指定的虚拟接口相关联的所有接口。
ioctl(fd, SIOCADDIFVIPA, (caddr_t)&ifrv);
struct ifvireq ifrv;
虚拟接口信息存储在 ifvireq 结构中。
注: 这些标志仅在虚拟接口上运行。
SIOCSIFADDR6 设置或添加 IPv6 地址。
ioctl(fd, SIOCSIFADDR6, (caddr_t)&ifr);
struct in6_ifreq ifr;
SIOCGIFADDR6 获取 IPv6 地址。
ioctl(fd, SIOCGIFADDR6, (caddr_t)&ifr);
struct in6_ifreq ifr;
SIOCSIFDSTADDR6 设置 IPv6 地址的目标 (点到点) 地址。
ioctl(fd, SIOCSIFDSTADDR6, (caddr_t)&ifr);
struct in6_ifreq ifr;
SIOCGIFDSTADDR6 获取 IPv6 地址的目标 (点到点) 地址。
ioctl(fd, SIOCGIFDSTADDR6, (caddr_t)&ifr);
struct in6_ifreq ifr;
SIOCSIFNETMASK6 设置 IPv6 地址的网络掩码。
ioctl(fd, SIOCSIFNETMASK6, (caddr_t)&ifr);
struct in6_ifreq ifr;
SIOCGIFNETMASK6 获取 IPv6 地址的网络掩码。
ioctl(fd, SIOCGIFNETMASK6, (caddr_t)&ifr);
struct in6_ifreq ifr;
SIOCDIFADDR6 删除 IPv6 地址。
ioctl(fd, SIOCDIFADDR6, (caddr_t)&ifr);
struct in6_ifreq ifr;
SIOCFIFADDR6 将 IPv6 地址放在地址列表的开头。
ioctl(fd, SIOCFIFADDR6, (caddr_t)&ifr);
struct in6_ifreq ifr;
SIOCAIFADDR6 添加或更改 IPv6 别名地址。
ioctl(fd, SIOCAIFADDR6, (caddr_t)&ifra);
struct in6_aliasreq ifra;
SIOCADDANY6 添加 IPv6 任何强制类型转换地址。
ioctl(fd, SIOCADDANY6, (caddr_t)&ifra);
struct in6_ifreq ifr;
SIOCDELANY6 删除 IPv6 任何强制类型转换地址。
ioctl(fd, SIOCDELANY6, (caddr_t)&ifra);
struct in6_ifreq ifr;
SIOCSIFZONE6 在特定地址作用域设置接口的 IPv6 区域标识。
ioctl(fd, SIOCSIFZONE6, (caddr_t)&ifrz);
struct in6_zonereq ifrz;
SIOCGIFZONE6 获取接口的 IPv6 作用域区域标识。
ioctl(fd, SIOCGIFZONE6, (caddr_t)&ifrz);
struct in6_zonereq ifrz;
SIOCSIFADDRORI6 设置 IPv6 地址的配置源。
ioctl(fd, SIOCSIFADDRORI6, (caddr_t)&ifro);
struct ifaddrorigin6 ifro;
SIOCAIFADDR6T 添加或更改 IPv6 别名地址和类型。
ioctl(fd, SIOCAIFADDR6T, (caddr_t)&ifra);
struct in6_aliasreq2 ifra;
SIOCGIFADDR6T 获取 IPv6 地址的类型。
ioctl(fd, SIOCGIFADDR6T, (caddr_t)&ifra);
struct in6_aliasreq2 ifra;
SIOCSIFADDRSTATE6 更改 IPv6 地址的状态。
ioctl(fd, SIOCSIFADDRSTATE6, (caddr_t)&ifra);
struct in6_aliasreq2 ifra;
SIOCGIFADDRSTATE6 获取 IPv6 地址的状态。
ioctl(fd, SIOCGIFADDRSTATE6, (caddr_t)&ifra);
struct in6_aliasreq2 ifra;
SIOCGSRCFILTER6 获取接口的 IPv6 多点广播组源过滤器。
ioctl(fd, SIOCGSRCFILTER6, (caddr_t)&ifrgsf);
struct group_source_filter_req ifrgsf;
SIOCACLADDR6 添加 IPv6 集群别名地址。
ioctl(fd, SIOCACLADDR6, (caddr_t)&ifra);
struct in6_aliasreq ifra;
SIOCDCLADDR6 删除 IPv6 集群地址。
ioctl(fd, SIOCDCLADDR6, (caddr_t)&ifr);
struct in6_ifreq ifr;
SIOCSIFADDRFLAG6 设置 IPv6 地址的地址源标志。
ioctl(fd, SIOCSIFADDRFLAG6, (caddr_t)&ifra2);
struct in6_aliasreq2 ifra2;
SIOCGIFADDRFLAG6 获取 IPv6 地址的地址源标志。
ioctl(fd, SIOCGIFADDRFLAG6, (caddr_t)&ifra2);
struct in6_aliasreq2 ifra2;

返回值

成功完成后, ioctl 将返回 0。 否则,将返回 -1 并设置 errno 以指示错误。

错误代码

ioctl 命令在以下常规条件下失败:
描述
EBADF 文件描述符 fd 不是有效的开放式套接字文件描述符。
EINTR ioctl 操作期间捕获到信号。
EINVAL 指定了无效的命令或参数。
如果由 ioctl 命令 cmd 指定的底层操作失败,那么 ioctl 将失败并返回下列其中一个错误代码:
描述
EACCES 对指定操作拒绝的许可权。
EADDRNOTAVAIL 指定的地址不可用于接口。
EAFNOSUPPORT 套接字上不支持的操作。
EBUSY 资源正忙。
EEXIST 存在条目或文件。
EFAULT 自变量引用不可访问的内存区域。
EIO 输入/输出错误。
ENETUNREACH 无法访问网关。
ENOBUFS 路由表溢出。
ENOCONNECT 无连接。
ENOMEM 没有足够的可用内存。
ENOTCONN 仅在已连接的套接字上定义了该操作,但未连接该套接字。
ENXIO 设备不存在。
ESRCH 没有这样的进程。