日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

《网络编程》ioctl 操作

發布時間:2023/12/18 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《网络编程》ioctl 操作 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

概要

? ? ? ? ?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 個值相應的第三個參數的數據類型是一個指向整數的指針。

  • SIOCATMARK:若套接字的?讀指針 當前位于帶外標記,則 ioctl 函數通過第三個參數指向的整數返回非 0 值;否則返回 0 值;
  • SIOCGPRP:通過由第三個參數指向的整數返回套接字的 進程 ID進程組 ID。該 ID 指定針對套接字的 SIGIO 或 SIGURG 信號的接收進程;等價于 fcntl 函數指定 F_GETOWN 命令;
  • SIOCSPGRP:把套接字的?進程 ID?或?進程組 ID?設置成由第三個參數指向的整數,該 ID 指定針對套接字的 SIGIO 或 SIGURG 信號的接收進程。等價于 fcntl 函數指定 F_SETOWN 命令。

  • 文件操作

    依據 請求 request 參數和第三個參數不同有下面的內容:

  • FIONBIO:依據 ioctl 函數第三個參數指向一個 0 值或非 0 值,可清除或設置套接字的非堵塞 I/O 標志;
  • FIOASYNC:依據 ioctl 函數第三個參數指向一個 0 值或非 0 值,可清除或設置套接字的信號驅動異步 I/O 標志,決定是否接收針對套接字的異步 I/O 信號(SIGIO);
  • FIONREAD:依據 ioctl 函數第三個參數指向的整數返回當前套接字接收緩沖區的字節數;
  • FIOSETOWN:對于套接字和前面的?SIOCSPGRP 等效:
  • 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 (onlyfor 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 下面是請求參數的值及其功能:

  • SIOCSARP:把一個新的表項加入到 ARP 快速緩存,或改動當中已經存在的一個表項。
  • SIOCDARP:從 ARP 快速緩存中刪除指定的一個表項;
  • 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 == 64short int rt_pad4[3]; #elseshort int rt_pad4; #endifshort 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. */}; 下面是請求參數的值及其功能:

  • SIOCADDRT:往路由表中添加一個表項;
  • SIOCDELRT:往路由表中刪除一個表項;
  • 總結

    這章內容基本是環繞 ioctl 函數中的請求參數和第三個參數進行的。感覺不好記憶,由于都是一些參數標志,相關信息還是查看書本上的解說,書本上有給出幾個樣例。
    參考資料: 《Unix 網絡編程》

    版權聲明:本文博主原創文章,博客,未經同意不得轉載。

    轉載于:https://www.cnblogs.com/gcczhongduan/p/4814052.html

    創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

    總結

    以上是生活随笔為你收集整理的《网络编程》ioctl 操作的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。