• 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    从路由表中删去一项

    无欲速,无见小利。欲速,则不达;见小利,则大事不成。
  • 相关阅读:
    Kotlin 学习笔记(一)
    Android 中调用本地命令
    Android 6.0 中的 Wifi 连接
    Android 中的广播机制
    面向对象之继承和多态
    2016 年秋季助教总结
    2016 年年志
    C 语言学习 第12次作业总结
    程序员编程艺术第三十六~三十七章、搜索智能提示suggestion,附近点搜索
    程序员编程艺术第三十四~三十五章:格子取数问题,完美洗牌算法
  • 原文地址:https://www.cnblogs.com/ch122633/p/8566710.html
Copyright © 2020-2023  润新知