|
ioctl函数
本函数影响由fd参数引用的一个打开的文件。
#include<unistd.h> int ioctl( int fd, int request, .../* void *arg */ ); 返回0:成功 -1:出错
第三个参数总是一个指针,但指针的类型依赖于request参数。
我们可以把和网络相关的请求划分为6类: 套接口操作 文件操作 接口操作 ARP高速缓存操作 路由表操作 流系统
下表列出了网络相关ioctl请求的request参数以及arg地址必须指向的数据类型:
套接口操作: 明确用于套接口操作的ioctl请求有三个,它们都要求ioctl的第三个参数是指向某个整数的一个指针。
SIOCATMARK: 如果本套接口的的度指针当前位于带外标记,那就通过由第三个参数指向的整数返回一个非0值;否则返回一个0值。POSIX以函数sockatmark替换本请求。 SIOCGPGRP: 通过第三个参数指向的整数返回本套接口的进程ID或进程组ID,该ID指定针对本套接口的SIGIO或SIGURG信号的接收进程。本请求和fcntl的F_GETOWN命令等效,POSIX标准化的是fcntl函数。 SIOCSPGRP: 把本套接口的进程ID或者进程组ID设置成第三个参数指向的整数,该ID指定针对本套接口的SIGIO或SIGURG信号的接收进程,本请求和fcntl的F_SETOWN命令等效,POSIX标准化的是fcntl操作。
文件操作: 以下5个请求都要求ioctl的第三个参数指向一个整数。
FIONBIO: 根据ioctl的第三个参数指向一个0或非0值分别清除或设置本套接口的非阻塞标志。本请求和O_NONBLOCK文件状态标志等效,而该标志通过fcntl的F_SETFL命令清除或设置。
FIOASYNC: 根据iocl的第三个参数指向一个0值或非0值分别清除或设置针对本套接口的信号驱动异步I/O标志,它决定是否收取针对本套接口的异步I/O信号(SIGIO)。本请求和O_ASYNC文件状态标志等效,而该标志可以通过fcntl的F_SETFL命令清除或设置。
FIONREAD: 通过由ioctl的第三个参数指向的整数返回当前在本套接口接收缓冲区中的字节数。本特性同样适用于文件,管道和终端。
FIOSETOWN: 对于套接口和SIOCSPGRP等效。 FIOGETOWN: 对于套接口和SIOCGPGRP等效。
接口配置: 得到系统中所有接口由SIOCGIFCONF请求完成,该请求使用ifconf结构,ifconf又使用ifreq 结构,如下所示:
Struct ifconf{ int ifc_len; // 缓冲区的大小 union{ caddr_t ifcu_buf; // input from user->kernel struct ifreq *ifcu_req; // return of structures returned }ifc_ifcu; };
#define ifc_buf ifc_ifcu.ifcu_buf //buffer address #define ifc_req ifc_ifcu.ifcu_req //array of structures returned
#define IFNAMSIZ 16
struct ifreq{ char ifr_name[IFNAMSIZ]; // interface name, e.g., “le0” 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 // address #define ifr_dstaddr ifr_ifru.ifru_dstaddr // otner end of p-to-p link #define ifr_broadaddr ifr_ifru.ifru_broadaddr // broadcast address #define ifr_flags ifr_ifru.ifru_flags // flags #define ifr_metric ifr_ifru.ifru_metric // metric #define ifr_data ifr_ifru.ifru_data // for use by interface
再调用ioctl前我们必须先分撇一个缓冲区和一个ifconf结构,然后才初始化后者。如下图 展示了一个ifconf结构的初始化结构,其中缓冲区的大小为1024,ioctl的第三个参数指向 这样一个ifconf结构。
1024 --------------------->缓存
假设内核返回2个ifreq结构,ioctl返回时通过同一个ifconf结构缓冲区填入了那2个ifreq结构,ifconf结构的ifc_len成员也被更新,以反映存放在缓冲区中的信息量。 |
关于网络接口的ioctl使用
最新推荐文章于 2021-06-14 18:20:45 发布
本文详细介绍了ioctl函数的功能及其在网络编程中的应用。ioctl函数可以用来影响已打开文件的状态,具体包括套接口操作、文件操作、接口配置等多种请求。文章还列举了ioctl函数在不同场景下的请求参数及对应的参数类型。
2007-02-09 16:45
4606

被折叠的 条评论
为什么被折叠?



