概要

ioctl 功能与 fcntl 功能类似,它可以被用于描述操作的叙述字符,获取或设置属性的描述是开放式的叙事休息,但在网络编程的两个功能有关的不同类型的操作。fcntl 作、文件操作,而 ioctl 函数除了能够操作 fcntl 函数可操作的类型之外,还能够进行接口操作、路由表操作、 ARP 快速缓存操作以及流系统操作。

ioctl 函数

该函数能够实现对已打开描写叙述符进程操作。其定义例如以下:

/* 函数功能:操作描写叙述符,设置已打开的描写叙述符属性。
* 函数原型:
*/
#include <sys/ioctl.h>
/* Perform the I/O control operation specified by REQUEST on FD.
One argument may follow; its presence and type depend on REQUEST.
Return value depends on REQUEST. Usually -1 indicates error. */
int ioctl (int fd, unsigned long int request, .../* void *arg */);
/*
* 说明:
* 把和网络相关的请求request划分为下面 6 类:
* (1)套接字操作
* (2)文件操作
* (3)接口操作
* (4)ARP快速缓存操作
* (5)路由表操作
* (6)流系统
*/
/*
*fcntl函数
*功能:操纵文件描写叙述符,设置已打开的文件的属性*/
int fcntl(int fd, int cmd, ... /* arg */ );
/*说明:
* fcntl 函数提供了与网络编程相关的特性例如以下:
* (1)非堵塞式IO。标志:O_NONBLOCK
* (2)信号驱动式IO;标志:O_ASYNC
* (3)套接字属性;标志:F_GETOWN、F_SETOWN
*
* cmd的取值能够例如以下:
* 拷贝文件描写叙述符
* F_DUPFD (long)
* 设置/获取文件描写叙述符标志
* F_GETFD (void)
* F_SETFD (long)
* 设置/获取文件状态标志
* F_GETFL (void)
* F_SETFL (long)
* 获取/设置文件锁
* F_GETLK
* F_SETLK,F_SETLKW
*/

当中 request 參数以及 arg 地址指向的数据类型与网络相关。下面列出了不同网络类型相应的信息:

以下针对由请求 request 划分的 6 大类进行分析。

套接字操作

由上面表格能够知道,在套接字操作中,ioctl 函数的请求 request 參数有 3 可选值,而且这 3 个值相应的第三个參数的数据类型是一个指向整数的指针。

  1. SIOCATMARK:若套接字的 读指针 当前位于带外标记,则 ioctl 函数通过第三个參数指向的整数返回非 0 值;否则返回 0 值;
  2. SIOCGPRP:通过由第三个參数指向的整数返回套接字的 进程 ID进程组 ID。该 ID 指定针对套接字的 SIGIO 或 SIGURG 信号的接收进程;等价于 fcntl 函数指定 F_GETOWN 命令;
  3. SIOCSPGRP:把套接字的 进程 ID 或 进程组 ID 设置成由第三个參数指向的整数,该 ID 指定针对套接字的 SIGIO 或 SIGURG 信号的接收进程。等价于 fcntl 函数指定 F_SETOWN 命令。

文件操作

依据 请求 request 參数和第三个參数不同有下面的内容:

  1. FIONBIO:依据 ioctl 函数第三个參数指向一个 0 值或非 0 值,可清除或设置套接字的非堵塞 I/O 标志;
  2. FIOASYNC:依据 ioctl 函数第三个參数指向一个 0 值或非 0 值,可清除或设置套接字的信号驱动异步 I/O 标志,决定是否接收针对套接字的异步 I/O 信号(SIGIO);
  3. FIONREAD:依据 ioctl 函数第三个參数指向的整数返回当前套接字接收缓冲区的字节数;
  4. FIOSETOWN:对于套接字和前面的 SIOCSPGRP 等效:
  5. FIOGETOWN:对于套接字和前面的 SIOCGPGRP 等效:

接口操作

须要处理网络接口。首先必须从内核获取配置在系统上的全部接口信息。详细请求 request 參数的取值由上表可知。SIOCGIFCONF:从内核中获取系统中配置的全部接口。它使用了结构 ifconf,ifconf 又使用了 ifreq 结构。

在调用 ioctl 之前分配一个缓冲区和一个 ifconf 结构,然后初始化后者,iotctl 的第三个參数指向 ifconf 结构。

/* 结构定义例如以下:*/
struct ifconf {
int ifc_len; /* size of buffer, value-result */
union {
caddr_t ifcu_buf; /* input from user->kernel */
struct ifreq *ifcu_req; /* return from kernel->user */
}ifc_ifcu;
};
#define ifc_buf ifc_ifcu.ifcu_buf
#define ifc_req ifc_ifcu.ifcu_req
#define IFNAMSIZ 16
struct ifreq {
char ifr_name[IFNAMSIZ];
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
#define ifr_dstaddr ifr_ifru.ifru_dstaddr
#define ifr_broadaddr ifr_ifru.broadaddr
#define ifr_flags ifr_ifru.ifru_flags
#define ifr_metric ifr_ifru.ifru_metric
#define ifr_data ifr_ifru.ifru_data

ARP 快速缓存操作

能够使用 ioctl 函数操作 ARP 快速缓存,ioctl 函数的第三个參数必须指向一个 arpreq 结构,其结构定义例如以下:

/* ARP ioctl request.  */
struct arpreq
{
struct sockaddr arp_pa; /* Protocol address. */
struct sockaddr arp_ha; /* Hardware address. */
int arp_flags; /* Flags. */
struct sockaddr arp_netmask; /* Netmask (only for proxy arps). */
char arp_dev[16];
}; /* ARP Flag values. */
#define ATF_COM 0x02 /* Completed entry (ha valid). */
#define ATF_PERM 0x04 /* Permanent entry. */
#define ATF_PUBL 0x08 /* Publish entry. */
#define ATF_USETRAILERS 0x10 /* Has requested trailers. */
#define ATF_NETMASK 0x20 /* Want to use a netmask (only
for proxy entries). */
#define ATF_DONTPUB 0x40 /* Don't answer this addresses. */
#define ATF_MAGIC 0x80 /* Automatically added entry. */ /* Support for the user space arp daemon, arpd. */
#define ARPD_UPDATE 0x01
#define ARPD_LOOKUP 0x02
#define ARPD_FLUSH 0x03

下面是请求參数的值及其功能:

  1. SIOCSARP:把一个新的表项加入到 ARP 快速缓存,或改动当中已经存在的一个表项。
  2. SIOCDARP:从 ARP 快速缓存中删除指定的一个表项;
  3. SIOCGARP:从 ARP 快速缓存中获取一个表项;

路由表操作

ioctl 函数有 2 个请求能够操作路由,其相应的第三个參数是指向 rtentry 结构的指针,该结构定义例如以下

/* This structure gets passed by the SIOCADDRT and SIOCDELRT calls. */
struct rtentry
{
unsigned long int rt_pad1;
struct sockaddr rt_dst; /* Target address. */
struct sockaddr rt_gateway; /* Gateway addr (RTF_GATEWAY). */
struct sockaddr rt_genmask; /* Target network mask (IP). */
unsigned short int rt_flags;
short int rt_pad2;
unsigned long int rt_pad3;
unsigned char rt_tos;
unsigned char rt_class;
#if __WORDSIZE == 64
short int rt_pad4[3];
#else
short int rt_pad4;
#endif
short int rt_metric; /* +1 for binary compatibility! */
char *rt_dev; /* Forcing the device at add. */
unsigned long int rt_mtu; /* Per route MTU/Window. */
unsigned long int rt_window; /* Window clamping. */
unsigned short int rt_irtt; /* Initial RTT. */
};

下面是请求參数的值及其功能:

  1. SIOCADDRT:往路由表中添加一个表项;
  2. SIOCDELRT:往路由表中删除一个表项;

总结

        这章内容基本是环绕 ioctl 函数中的请求參数和第三个參数进行的。感觉不好记忆,由于都是一些參数标志,相关信息还是查看书本上的解说,书本上有给出几个样例。

參考资料:
《Unix 网络编程》

版权声明:本文博主原创文章,博客,未经同意不得转载。

《网络编程》ioctl 操作的更多相关文章

  1. UNIX网络编程--ioctl操作(十七)

    一.概述 在本书中有两个地方都对这个函数进行了介绍,其实还有很多地方需要这个函数.ioclt函数传统上一直作为纳西而不适合归入其他精细定义类别的特性的系统接口.网络程序(特别是服务器程序)经常在程序启 ...

  2. Linux系统编程:socket网络编程(操作篇)

    一.问题思考 问1.网络通信应用在什么场合?通信的前提是什么? 答1.主要应用在不同主机进程间的互相通信,同一主机的进程也可以使用网络进行通信.通信的前提是如何标识通信进程的唯一,由于不同主机的进程极 ...

  3. 第7课:sql注入、操作session、cookie实例、网络编程、操作Excel

    1. 简单讲一些sql注入的内容 name = 'zdq' sex = '女' cur.execute("select * from bt_stu where real_name='%s'& ...

  4. UNIX网络编程——ioctl 函数的用法详解

    1.介绍 Linux网络程序与内核交互的方法是通过ioctl来实现的,ioctl与网络协议栈进行交互,可得到网络接口的信息,网卡设备的映射属性和配置网络接口.并且还能够查看,修改,删除ARP高速缓存的 ...

  5. Linux&c 文件操作,线程进程控制,网络编程,简单知识点梳理

    一:文件操作 在linux下,一切皆文件,目录是文件,称为目录文件,内容是该目录的目录项(但是目录只有内核可以编辑,超级用户也不可以编辑),设备也是设备文件,在/dev存放的就是一些设备文件,linu ...

  6. Linux&c 文件操作,线程进程控制,网络编程,简单知识点梳理

    一:文件操作 在linux下,一切皆文件,目录是文件,称为目录文件,内容是该目录的目录项(但是目录只有内核可以编辑,超级用户也不可以编辑),设备也是设备文件,在/dev存放的就是一些设备文件,linu ...

  7. [转]C#网络编程(基本概念和操作) - Part.1

    本文转自:http://www.tracefact.net/CSharp-Programming/Network-Programming-Part1.aspx 引言 C#网络编程系列文章计划简单地讲述 ...

  8. Android之网络编程利用PHP操作MySql插入数据(四)

    因为最近在更新我的项目,就想着把自己在项目中用到的一些的简单的与网络交互的方法总结一下,所以最近Android网络编程方面的博文会比较多一些,我尽量以最简单的方法给大家分享,让大家明白易懂.如果有什么 ...

  9. c/c++ 网络编程 UDP 用if_nameindex和ioctl取得主机网络信息

    网络编程 UDP 用if_nameindex和ioctl取得主机网络信息 getifaddrs函数取得的东西太多了,如果只想取得网卡名字和网卡编号可以用下面的2个函数. 1,if_nameindex ...

随机推荐

  1. 【习题 5-2 UVA-1594】Ducci Sequence

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] map加vector轻松搞定. [代码] #include <bits/stdc++.h> using namespac ...

  2. UVA Bandwidth

    题目例如以下: Bandwidth  Given a graph (V,E) where V is a set of nodes and E is a set of arcsin VxV, and a ...

  3. watchdog的正确使用方法

    关于watchdog应该有过单片机学习经历的人.都比較熟悉.但watchdog的正确使用方法,恐怕大家假设没有经历过实际产品的开发不会有深入的理解. 瑞萨RL78系列的单片机自身带有watchdog, ...

  4. vc弹出USB的方法. 附试验通过的代码!

    vc弹出USB的方法. 附试验通过的代码! http://blog.sina.com.cn/s/blog_4fcd1ea30100qrzn.html (2011-04-15 10:09:48) boo ...

  5. Injector Job深入分析 分类: H3_NUTCH 2015-03-10 15:44 334人阅读 评论(0) 收藏

    Injector Job的主要功能是根据crawlId在hbase中创建一个表,将将文本中的seed注入表中. (一)命令执行 1.运行命令 [jediael@master local]$ bin/n ...

  6. php实现数值的整数次方

    php实现数值的整数次方 一.总结 没有考虑到指数为负数的情况 二.php实现数值的整数次方 题目描述: 给定一个double类型的浮点数base和int类型的整数exponent.求base的exp ...

  7. Selector API用法

    java.nio.channels 类 Selector java.lang.Object java.nio.channels.Selector 直接已知子类: AbstractSelector pu ...

  8. <Linux> Linux下一些常用命令(个人记录)

    mount -o loop XXXX  XXX ./XXX &   后台运行 rm -rf XXX  删除文件夹 rm -rf *  删除当前目录下的所有文件 包括文件夹 ps -ef | g ...

  9. ios app初始化和数据迁移的设计思路

    整体思路 一般app启动之后,都有一个初始化的过程. 此外兴许app升级,还须要考虑数据迁移.所以初始化和数据迁移的框架.在初期的版本号就要考虑好 总结一下我们的app採取的方案: 1.在持久化的文件 ...

  10. 使用apidoc 生成Restful web Api文档

    在项目开发过程中,总会牵扯到接口文档的设计与编写,之前使用的都是office工具,写一个文档,总也是不够漂亮和直观.好在git上的开源大神提供了生成文档的工具,so来介绍一下! 该工具是Nodejs的 ...