本函数影响由fd参数引用的一个打开的文件。
#include<unistd.h>
int ioctl( int fd, int request, ... );
返回0:成功
第三个参数总是一个指针,但指针的类型依赖于request参数。
我们可以把和网络相关的请求划分为6类:
套接口操作
下表列出了网络相关ioctl请求的request参数以及arg地址必须指向的数据类型:
类别
套
接
口
SIOCSPGRP
SIOCGPGRP
设置套接口的进程ID或进程组ID
获取套接口的进程ID或进程组ID
int
int
文
件
FIOASYNC
FIONREAD
FIOSETOWN
FIOGETOWN
设置/清除信号驱动异步I/O标志
获取接收缓存区中的字节数
设置文件的进程ID或进程组ID
获取文件的进程ID或进程组ID
int
int
int
int
接
口
SIOCSIFADDR
SIOCGIFADDR
SIOCSIFFLAGS
SIOCGIFFLAGS
SIOCSIFDSTADDR
SIOCGIFDSTADDR
SIOCGIFBRDADDR
SIOCSIFBRDADDR
SIOCGIFNETMASK
SIOCSIFNETMASK
SIOCGIFMETRIC
SIOCSIFMETRIC
SIOCGIFMTU
SIOCxxx
设置接口地址
获取接口地址
设置接口标志
获取接口标志
设置点到点地址
获取点到点地址
获取广播地址
设置广播地址
获取子网掩码
设置子网掩码
获取接口的测度
设置接口的测度
获取接口MTU
(还有很多取决于系统的实现)
struct ifreq
struct ifreq
struct ifreq
struct ifreq
struct ifreq
struct ifreq
struct ifreq
struct ifreq
struct ifreq
struct ifreq
struct ifreq
struct ifreq
struct ifreq
ARP
SIOCGARP
SIOCDARP
获取ARP表项
删除ARP表项
struct arpreq
struct arpreq
路
由
SIOCDELRT
删除路径
struct rtentry
流
套接口操作:
明确用于套接口操作的ioctl请求有三个,它们都要求ioctl的第三个参数是指向某个整数的一个指针。
SIOCATMARK:
SIOCGPGRP:
SIOCSPGRP:
文件操作:
以下5个请求都要求ioctl的第三个参数指向一个整数。
FIONBIO:
FIOASYNC:
FIONREAD:
FIOSETOWN:
FIOGETOWN:
接口配置:
得到系统中所有接口由SIOCGIFCONF请求完成,该请求使用ifconf结构,ifconf又使用ifreq
结构,如下所示:
Struct ifconf
{
union
{
};
#define
#define
#define
struct ifreq
{
union
{
};
#define ifr_addr
#define ifr_dstaddr
#define ifr_broadaddr ifr_ifru.ifru_broadaddr
#define ifr_flags
#define ifr_metric
#define ifr_data
再调用ioctl前我们必须先分撇一个缓冲区和一个ifconf结构,然后才初始化后者。如下图
展示了一个ifconf结构的初始化结构,其中缓冲区的大小为1024,ioctl的第三个参数指向
这样一个ifconf结构。
假设内核返回2个ifreq结构,ioctl返回时通过同一个ifconf结构缓冲区填入了那2个ifreq结构,ifconf结构的ifc_len成员也被更新,以反映存放在缓冲区中的信息量。
文章出处:飞诺网(www.firnow.com):http://dev.firnow.com/course/6_system/linux/Linuxjs/20090822/169862.html