ioctl 套接字控制操作
用途
执行与网络相关的控制操作。
语法
#include <sys/ioctl.h>
int ioctl (fd, cmd, .../* arg */)
int fd;
int cmd;
int ... /* arg */描述
套接字 ioctl 命令执行各种与网络相关的控制。 fd 参数是套接字描述符。 对于非套接字描述符,未指定此调用所执行的函数。
cmd 自变量和可选的第三个自变量 (具有不同的类型) 将传递到套接字 ioctl 函数并由其解释,以执行用户指定的相应控制操作。
参数
| 项 | 描述 |
|---|---|
| fd | 打开引用通过使用套接字或接受调用创建的套接字的文件描述符。 |
| 命令 | 选择要执行的控制功能。 |
| .../ * arg */ | 表示请求的功能所需的信息。 arg 的类型取决于特定控制请求,但它是特定于套接字的数据结构的整数或指针。 |
套接字控制操作
| ioctl 命令 | 描述 |
|---|---|
| SIOCATMARK | 确定读指针是否指向 DataStream中的逻辑标记。 逻辑标记指示发送频带外数据的点。如果 atmark 在返回时设置为 1 ,那么读取指针将指向标记,下一次读取将返回标记后的数据。 如果 atmark 在返回时设置为 0 (假定 DataStream上存在频带外数据) ,那么下一次读取将返回在频带外标记之前发送的数据。注: 频带外数据是逻辑上独立的数据通道,独立于正常数据传递给用户; 此外,由于需要立即注意,还会发送信号。 Ctrl-C 字符是一个示例。
|
SIOCSPGRP SIOCGPGRP |
SIOCSPGRP 设置套接字的进程组信息。 SIOCGPGRP 获取与套接字关联的进程组标识。
|
路由表控制操作
| ioctl 命令 | 描述 |
|---|---|
SIOCADDRT SIOCDELRT |
SIOCADDRT 在路由表中添加路由条目。 SIOCDELRT 从路由表中删除路由条目。
|
| SIOUPDROUTE | 使用 ifreq 结构中传递的信息更新路由表。 |
ARP 表控制操作
| ioctl 命令 | 描述 |
|---|---|
SIOCSARP SIOCDARP SIOCGARP |
SIOCSARP 在 ARP 表中添加或修改 ARP 条目。 SIOCDARP 从 ARP 表中删除 ARP 条目。 SIOCGARP 从 ARP 表中获取 ARP 条目。
ARP 条目信息在 arpreq 结构中传递。 如果 |
全局网络参数控制操作
| ioctl 命令 | 描述 |
|---|---|
SIOCSNETOPT SIOCGNETOPT SIOCDNETOPT SIOCGNETOPT1 |
SIOCSNETOPT 设置网络选项的值。 SIOCGNETOPT 获取网络选项的值。 SIOCDNETOPT 设置网络选项的缺省值。
SIOCGNETOPT1 获取网络选项的当前值,缺省值和范围。
网络选项信息在返回时存储在 optreq1 结构中。 optreq 和 optreq1 结构在 net/netopt.h中定义。 |
SIOCGNMTUS 西奥克特姆图斯 SIOCADDMTU SIOCDELMTU |
SIOCGNMTUS 获取公共 MTU 列表中维护的 MTU 数。 SIOCADDMTU 在公共 MTU 列表中添加 MTU。 SIOCDELMTU 从公共 MTU 列表中删除 MTU。
SIOCGETMTUS 获取公共 MTU 列表中维护的 MTU。
get_mtus 结构在 netinet/in.h中定义。 |
接口控制操作
| ioctl 命令 | 描述 |
|---|---|
SIOCSIFADDR SIOCDIFADDR |
SIOCSIFADDR 设置接口地址。 SIOCDIFADDR 删除接口地址。 接口地址在 ifr.ifr_addr 字段中指定。 SIOCGIFADDR 获取接口地址。 该地址在 ifr.ifr_addr 字段中返回。
|
SIOCAIFADDR |
SIOCAIFADDR 添加接口地址。 接口名称在 ifr.ifra_name 字段中指定。 别名 IP 地址在 theifr.ifra_addr 字段中指定。 可以在 ifr.ifra_broadaddr 字段中指定别名 IP 广播地址,也可以在 ifr.ifra_mask中指定别名 IP 网络掩码。
|
| SIOCGIFADDRS | 获取与接口关联的地址的列表。接口名称在 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 字段中。
|
Siocsifnetmask SIOCGIFNETMASK |
SIOCSIFNETMASK 设置在 ifr.ifr_addr 字段中指定的接口网络掩码。 SIOCGIFNETMASK 获取接口网络掩码。
|
SIOCSIFBRDADDR SIOCGIFBRDADDR |
SIOCSIFBRDADDR 设置在 ifr.ifr_broadaddr 字段中指定的接口广播地址。 SIOCGIFBRDADDR 获取接口广播地址。 广播地址位于 ifr.ifr_broadaddr 字段中。
|
| SIOCGSIZIFCONF | 获取获取 SIOCGIFCONF 返回的所有接口的配置信息所需的内存大小。 |
| SIOCGIFCONF | 返回系统上配置的所有接口的配置信息。配置信息将在 ifc.ifc_req 字段指向的 ifreq 结构列表中返回,每个接口一个 ifreq 结构。注: ioctl 命令的调用者必须分配足够的空间来存储配置信息 (作为系统上配置的所有接口的 ifreq 结构列表返回)。 例如,如果在系统上配置了 n 接口,那么 ifc.ifc_req 必须指向 {n * sizeof (struct ifreq)} 分配的空间字节。
注: 或者, SIOCGSIZIFCONF ioctl 命令可用于此目的。
|
SIOCSIFFLAGS SIOCGIFFLAGS |
SIOCSIFFLAGS 设置接口标志。 SIOCGIFFLAGS 获取接口标志。请参阅 /usr/include/net/if.h 以获取由 IFF_xxx表示的接口标志。注: 不能使用 ioctl 更改 IFF_BROADCAST, IFF_POINTTOPOINT, IFF_SIMPLEX, IFF_RUNNING, IFF_OACTIVE和 IFF_MULTICAST 标志。
|
SIOCSIFMETRIC SIOCGIFMETRIC |
SIOCSIFMETRIC 设置在 ifr.ifr_metric 字段中指定的接口度量。 SIOCGIFMETRIC 获取接口度量。 接口度量值在返回时放置在 ifr.ifr_metric 字段中。
|
SIOCSIFSUB陈 SIOCGIFSUB陈 |
SIOCSIFSUB陈设置在 ifr.ifr_flags 字段中指定的子通道地址。 SIOCGIFSUB陈在 ifr.ifr_flags 字段中获取子通道地址。 |
SIOCSIFOPTIONS SIOCGIF 选项 |
SIOCSIFOPTIONS 设置接口选项。 SIOCGIFOPTIONS 获取接口选项。接口选项存储在 ifreq 结构的 ifr_flags 字段中。 请参阅 /usr/include/net/if.h 文件,以获取由 IFO_xxx表示的接口选项列表。 |
| ioctl 命令 | 描述 |
|---|---|
西奥卡多 西奥克德尔多 |
SIOCADDMULTI 将地址添加到接口的多点广播地址列表中。 SIOCDELMULTI 从接口的多点广播地址列表中删除多点广播地址。
|
| SIOCGETVIFCNT | 获取虚拟接口的包计数信息。 此信息在 sioc_vif_req 结构中指定。 |
| SIOCGETSGCNT | 获取指定源组的包计数信息。 此信息在返回时存储在 sioc_sg_req 结构中。 |
SIOCSIFMTU SIOCGIFMTU |
SIOCSIFMTU 设置接口最大传输单元 (MTU)。 SIOCGIFMTU 获取接口 MTU。MTU 值存储在 ifr.ifr_mtu 字段中。注: MTU 的有效值范围因接口而异,并且取决于接口类型。
|
SIOCIFATTACH SIOCIFDETACH |
SIOCIFATTACH 连接接口。 这将初始化并在网络接口列表中添加接口。 SIOCIFDETACH 拆离接口广播地址。 这将从网络接口列表中除去接口。 接口名称在 ifr.ifr_name 字段中指定。 |
SIOCSIFGIDLIST SIOCGIFGIDLIST |
SIOCSIFGIDLIST 将 ifrg.ifrg_gidlist 字段中指定的组标识列表添加或删除到 gidlist 接口。 接口名称在 ifrg.ifrg_name 字段中指定。 在 ifrg.ifrg_gidlist 字段中指定的操作码 ADD_GRP/DEL_GRP指示指定的组标识列表是必须添加到 gidlist 接口还是从该接口中删除。 SIOCGIFGIDLIST 获取与接口关联的组标识的列表。 组标识将在返回时放在 ifrg.ifrg_gidlist 字段中。 |
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 获取与接口关联的特定于接口的网络选项。
|
| Siocgifbaudrate | 获取 ifr_baudrate 字段中接口波特率的值。波特率存储在 ifr.ifr_baudrate 字段中。 |
西奥卡迪夫维帕 西奥克代利维帕 SIOCLISTIFVIPA |
SIOCADDIFVIPA 将 ifrv.ifrv_ifname 指向的接口的指定列表与 ifrv.ifrv_name指定的虚拟接口相关联。 此操作会将这些接口上所有传出包的源地址设置为虚拟接口地址。 SIOCDELIFVIPA 通过使用 SIOCADDIFVIPA 除去由 ifrv.ifrv_ifname 指向并与 ifrv.ifrv_name指定的虚拟接口相关联的指定接口的列表。 SIOCLISTIFVIPA 列出与 ifrv.ifrv_name指定的虚拟接口相关联的所有接口。虚拟接口信息存储在 ifvireq 结构中。注: 这些标志仅在虚拟接口上运行。
|
| SIOCSIFADDR6 | 设置或添加 IPv6 地址。 |
| SIOCGIFADDR6 | 获取 IPv6 地址。 |
| SIOCSIFDSTADDR6 | 设置 IPv6 地址的目标 (点到点) 地址。 |
| SIOCGIFDSTADDR6 | 获取 IPv6 地址的目标 (点到点) 地址。 |
| SIOCSIFNETMASK6 | 设置 IPv6 地址的网络掩码。 |
| SIOCGIFNETMASK6 | 获取 IPv6 地址的网络掩码。 |
| SIOCDIFADDR6 | 删除 IPv6 地址。 |
| SIOCFIFADDR6 | 将 IPv6 地址放在地址列表的开头。 |
| SIOCAIFADDR6 | 添加或更改 IPv6 别名地址。 |
| SIOCADDANY6 | 添加 IPv6 任何强制类型转换地址。 |
| SIOCDELANY6 | 删除 IPv6 任何强制类型转换地址。 |
| SIOCSIFZONE6 | 在特定地址作用域设置接口的 IPv6 区域标识。 |
| SIOCGIFZONE6 | 获取接口的 IPv6 作用域区域标识。 |
| SIOCSIFADDRORI6 | 设置 IPv6 地址的配置源。 |
| SIOCAIFADDR6T | 添加或更改 IPv6 别名地址和类型。 |
| SIOCGIFADDR6T | 获取 IPv6 地址的类型。 |
| SIOCSIFADDRSTATE6 | 更改 IPv6 地址的状态。 |
| SIOCGIFADDRSTATE6 | 获取 IPv6 地址的状态。 |
| SIOCGSRCFILTER6 | 获取接口的 IPv6 多点广播组源过滤器。 |
| SIOCACLADDR6 | 添加 IPv6 集群别名地址。 |
| SIOCDCLADDR6 | 删除 IPv6 集群地址。 |
| SIOCSIFADDRFLAG6 | 设置 IPv6 地址的地址源标志。 |
| SIOCGIFADDRFLAG6 | 获取 IPv6 地址的地址源标志。 |
返回值
成功完成后, ioctl 将返回 0。 否则,将返回 -1 并设置 errno 以指示错误。
错误代码
| 项 | 描述 |
|---|---|
| EBADF | 文件描述符 fd 不是有效的开放式套接字文件描述符。 |
| EINTR | ioctl 操作期间捕获到信号。 |
| EINVAL | 指定了无效的命令或参数。 |
| 项 | 描述 |
|---|---|
| EACCES | 对指定操作拒绝的许可权。 |
| EADDRNOTAVAIL | 指定的地址不可用于接口。 |
| EAFNOSUPPORT | 套接字上不支持的操作。 |
| EBUSY | 资源正忙。 |
| EEXIST | 存在条目或文件。 |
| EFAULT | 自变量引用不可访问的内存区域。 |
| EIO | 输入/输出错误。 |
| ENETUNREACH | 无法访问网关。 |
| ENOBUFS | 路由表溢出。 |
| ENOCONNECT | 无连接。 |
| ENOMEM | 没有足够的可用内存。 |
| ENOTCONN | 仅在已连接的套接字上定义了该操作,但未连接该套接字。 |
| ENXIO | 设备不存在。 |
| ESRCH | 没有这样的进程。 |