ioctl函数java 本函数影响由fd 参数引用的一个打开的文件。linux #include<unistd.h>ios int ioctl( int fd, int request, .../* void *arg */ );编程 返回0 :成功 -1 :出错缓存 第三个参数老是一个指针,但指针的类型依赖于request 参数。服务器 咱们能够把和网络相关的请求划分为6 类:网络 套接口操做dom 文件操做异步 接口操做socket ARP 高速缓存操做 路由表操做 流系统 下表列出了网络相关ioctl 请求的request 参数以及arg 地址必须指向的数据类型: 类别/ Request/ 说明/ 数据类型
|
套接口操做: 明确用于套接口操做的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 结构,以下所示: (略) 再调用ioctl 前咱们必须先分撇一个缓冲区和一个ifconf 结构,而后才初始化后者。以下图 展现了一个ifconf 结构的初始化结构,其中缓冲区的大小为1024 ,ioctl 的第三个参数指向 这样一个ifconf 结构。 ifc_len 1024 Ifc_buf ---------------------> 缓存 假设内核返回2 个ifreq 结构,ioctl 返回时经过同一个ifconf 结构缓冲区填入了那2 个ifreq 结构, ifconf 结构的ifc_len 成员也被更新,以反映存放在缓冲区中的信息量 通常来说ioctl在用户程序中的调用是: ioctl(int fd,int command, (char*)argstruct) ioctl调用与网络编程有关(本文只讨论这一点),文件描述符fd其实是由socket()系统调用返回的。 参数command的取值由/usr/include/linux/sockios.h 所规定。这些command的因为功能的不一样,可分为如下几个小类: ? 改变路由表 (例如 SIOCADDRT, SIOCDELRT), ? 读/更新 ARP/RARP 缓存(如:SIOCDARP, SIOCSRARP), ? 通常的与网络接口有关的(例如 SIOCGIFNAME, SIOCSIFADDR 等等) 在 Gooodies目录下有不少样例程序展现了如何使用ioctl。当你看这些程序时,注意参数argstruct是与参数command相关的。 例如,与路由表相关的ioctl使用rtentry这种结构,rtentry定义在/usr/include/linux/route.h(参见例子 adddefault.c)。 与ARP有关的ioctl调用使用arpreq结构,arpreq定义在/usr/include/linux /if_arp.h(参见例子arpread.c) 与网络接口有关的ioctl调用使用的command参数一般看起来像SIOCxIFyyyy的形式,这里x要么是S(设定set,写write),要么是G(获得get,读read)。 在getifinfo.c程序中就使用了这种形式的command参数来读 IP地址,硬件地址,广播地址和获得与网络接口有关的一些标志(flag)。 在这些ioctl调用中,第三个参数是ifreq结构,它在/usr /include/linux/if.h中定义。 在某些状况下, ioctrl调用可能会使用到在sockios.h以外的新的定义,例如,WaveLAN无线网络卡会保..........(还有不少内容,在此略过) socket函数: int socket(int domain,int type, int protocol); domain:表示所使用的协议族; type:表示套接口的类型; protocol:表示所使用的协议族中某个特定的协议。 若是函数调用成功,套接口的描述符(非负整数)就做为函数的返回值,假如返回值为-1,就代表有错误发生。 利用socket函数来获取网卡MAC信息时,domain参数取值AF_INET,表示采用internet协议族;type参数指定为SOCK_DGRAM,表示采用数据报类型套接口,protocol参数在这种组合下只有惟一选择,故用0填充。 I/O控制函数ioctl用于对文件进行底层控制,这里的文件包含网卡、终端、磁带机、套接口等软硬件设施,实际的操做来自各个设备本身提供的ioctl接口。ioctl函数的原型以下: int ioctl(int d,int request,…) 这里,参数d取值套接口的描述符,第一个request参数指定经过socket传输的I/O类型。本实验能够取值 SIONGIFHWADDR(0x8927),表示取硬件地址。其余取值及其含义详见/usr/includr/linux/sockios.h。其后的 request参数用于为实现I/O控制所必须传入或传出的参数。本实验须要用ifr结构传入网卡设备名,并传出6B的MAC地址。 socket简介: 所谓socket一般也称做"套接字",用于描述IP地址和端口,是一个通讯链的句柄。应用程序一般经过"套接字"向网络发出请求或者应答网络请求 以J2SDK-1.3为例,Socket和ServerSocket类库位于java.net包中。ServerSocket用于服务器端,Socket是创建网络链接时使用的。在链接成功时,应用程序两端都会产生一个Socket实例,操做这个实例,完成所需的会话。对于一个网络链接来讲,套接字是平等的,并无差异,不由于在服务器端或在客户端而产生不一样级别。不论是Socket仍是ServerSocket它们的工做都是经过SocketImpl类及其子类完成的。 用ioctl得到本地ip地址时要用到两个结构体ifconf和ifreq,它们对于大多数人 首先先认识一下ifconf和ifreq: //ifconf一般是用来保存全部接口信息的
ifconf { int
*ifcu_buf; /* input from user->kernel*/
ifreq *ifcu_req; /* return from kernel->user*/
咱们的作法是: 具体使用时咱们能够认为ifconf就有两个成员:
ifc_len:表示用来存放全部接口信息的缓冲区长度 因此咱们须要在程序开始时对ifconf的ifc_len和ifc_buf进行初始化 接下来咱们只须要从一个一个的接口信息获取ip地址信息便可。 下面有一个简单的参考: #include #include #include #include #include in
} return 0;} |