UNP学习 ioctl操作

Posted 思而不学

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UNP学习 ioctl操作相关的知识,希望对你有一定的参考价值。

一、ioctl函数

#include <unistd.h>

int ioctl(int fd, int request, ... /* void * arg */);
返回:成功0,出错-1
第三个参数总是一个指针
request:指针类型依赖于request(请求)

我们可以把网络有关的请求分为6类:

  • 套接口操作
  • 文件操作
  • 接口操作
  • ARP高速缓存操作
  • 路由表操作
  • 流系统(第33章)

 

二、套接口操作

SIOCATMARK如果套接口的读指针当前在带外标志上,则通过第三个参数指向的整数返回一个i额非零值,否则返回零。

SIGCGPRGRP通过第三个参数指向的整数返回来自接收来这个套接口的SIGIO或SIGURG信号而设置的进程ID或进程组ID。

SIGCSPGRP用第三个参数指向的整数设置进程ID或进程组ID以接收

 

三、文件操作

下面的五中请求都要求ioctl的第三个参数指向一个整数

FIONBIO套接口的非阻塞标志会根据ioctl的第三个参数指向的值是否为零而清除或设置。

这个请求和用fcntl的F_SETFL命令设置和清除O_NONBLOCK文件状态标志效果相同。

FIOASYNC这个标志根据ioctl的第三个参数指向的值是否为零决定清除或接收套接口上的异步I/O信号(SIGIO)。

这个标志用fcntl的F_SETFL命令设置和清除O_AYNC文件状态标志效果相同。

FIONREAD在ioctl的第三个参数指向的整数里返回套接口接收缓冲区中当前的字节数。

这种功能在文件、管道和终端上都能用。

FiosETOWN在套接口上等价于 SIOCSPGRP

FIOGETOWN在套接口上等价于SIOCGPGRP

 

四、接口配置

五、接口操作

SIOCGIFADDR:在ifr_addr成员中返回单播地址。

SIOCSIFADDR:用ifr_addr成员设置接口地址。这个接口的初始化函数也被调用

SIOCGIFFLAGS:在ifr_flags成员中返回接口标志。各种标志的名字为IFF_xxx,在<net/if.h>头文件中定义。

SIOCSIFFLAGS:用ifr_flags成员设置接口标志

SIOCGIFDSTADDR:在ifr_dstaddr成员中返回点到点地址

SIOCSIFDSTADDR:用ifr_dstaddr成员设置等电点地址

SIOCGIFBRDADDR:在ifr_broadaddr成员中返回广播地址。

SIOCSIFBRDADDR:用ifr_broadaddr成员设置广播地址

SIOCGIFNETMASK:用ifr_addr成员中返回子网掩码

SIOCSIFNETMASK:用ifr_addr成员设置子网掩码

SIOCGIFMETRIC:用ifr_metric成员返回接口的测度

SIOCSIFMETRIC:用ifr_metric成员设置接口的路由测度

 

六、ARP高速缓存操作

ARP高速缓存也是由ioctl函数操作的。这些请求使用一个arpreq结构,它是在<net/if_arp.h>头文件定义的

struct arpreq {
    struct sockaddr arp_pa;            /* protocol address */
    struct sockaddr arp_ha;            /* hardware address */
    int arp_flags;                          /* flags */
};

#define ATF_INUSE 0x01              /* entry in use */
#define ATF_COM   0x02              /* completed entry (hardware addr valid) */
#define ATF_PERM  0x04              /* permanent entry */
#define ATF_PUBL   0x08              /* published entry (respond for other host) */

SIOCSARP:把新项加到ARP高速缓存中或修改一个已有项。

SIOCDARP:从ARP高速缓存中删除一项。

SIOCGARP:从ARP高速缓存中取一项。

 

七、路由表操作

有两种ioctl请求用来操作路由表。这两个请求要求ioctol必须指向一个rtentry结构的指针,它在<net/route.h>中定义。

只有超级用户才能发出这些请求。

SIOCADDRT    向路由表中加一项

SIOCDELRT    从路由表中删去一项

 

以上是关于UNP学习 ioctl操作的主要内容,如果未能解决你的问题,请参考以下文章

UNP卷一学习笔记:I/O模型

UNP卷一学习笔记:I/O模型

关于构造IOCTL命令的学习心得

UNP学习第六章

UNP学习第六章

UNP学习第五章