ioctl操作
ioctl操作 傳統上ioctl函數是用于那些普遍使用,但不適合歸入其他類別的任何特性的系統接 口。Posix去掉了ioctl,它通過 創建特殊的其功能已被Posix標準化的包裹函數來代替ioctl。這一章介紹和網絡 編程有關的ioctl操作。 1. ioctl函數 int ioctl(int d, int request, ...); 和網絡有關的ioctl請求有6類: 套接口操作 文件操作 接口操作 ARP高速緩存操作 路由表操作 流系統 2. 套接口操作
| 類別 | 請求 | 描述 | 數據類型 |
| 套接口 | SIOCATMASK | 在帶外標志上嗎 | int |
| ? | SIOCSPGRP | 設置套接口的進程ID和進程組ID | int |
| ? | SIOCGPGPR | 獲取套接口的進程ID和進程組ID | int |
| 類別 | 請求 | 描述 | 數據類型 |
| 文件操作 | FIONBIO | 設置/清除非阻塞標志 | int |
| FIOASYNC | 設置/清除異步I/O標志 | int | |
| FIONREAD | 獲取接收緩沖區中數據的字節數 | int | |
| FIOSETOWN | 設置文件的進程ID或進程組ID | int | |
| FIOGETOWN | 獲取文件的進程ID或進程組ID | int |
| 類別 | 請求 | 描述 | 數據類型 |
| 接口 | SIOCGIFCONF | 獲取所有接口的列表 | struct ifconf |
| SIOCSIFADDR | 設置接口地址 | struct ifreq | |
| SIOCGIFADDR | 獲取接口地址 | struct ifreq | |
| SIOCSIFFLAGS | 設置接口標志 | struct ifreq | |
| SIOCGIFFLAGS | 獲取接口標志 | struct ifreq | |
| SIOCSIFDSTADDR | 設置點對點地址 | struct ifreq | |
| SIOCGIFDSTADDR | 獲取點對點地址 | struct ifreq | |
| SIOCGIFBRDADDR | 獲取廣播地址 | struct ifreq | |
| SIOCSIFBRDADDR | 設置廣播地址 | struct ifreq | |
| SIOCGIFNETMASK | 獲取子網掩碼 | struct ifreq | |
| SIOCSIFNETMASK | 設置子網掩碼 | struct ifreq | |
| SIOCGIFMETRIC | 獲取接口的測度(metric) | struct ifreq | |
| SIOCSIFMETRIC | 設置接口的測度(metric) | struct ifreq | |
| SIOCxxx |
| 類別 | 請求 | 描述 | 數據類型 |
| ARP | SIOCSARP | 創建/修改ARP項 | struct arpreq |
| SIOCGARP | 獲取ARP項 | struct arpreq | |
| SIOCDARP | 刪除ARP項 | struct arpreq |
| 類別 | 請求 | 描述 | 數據類型 |
| 路由 | SIOCADDRT | 增加路徑 | struct rtentry |
| SIOCDELRT | 刪除路徑 | struct rtentry |
=====================================================================================================
套接口ioctl函數
#include <unistd.h>int ioctl(int fd, int request, … /* void *arg */ );
返回:成功返回0,出錯返回-1。
第三個參數總是一個指針,但指針的類型依賴于request。
ioctl和網絡有關的請求可分為如下6類:
| 類別 | request | 描述 | 數據類型 |
| 套接口 | SIOCATMARK | 在帶外標志上嗎 | int |
| SIOCSPGRP | 設置套接口的進程ID或進程組ID | int | |
| SIOCGPGRP | 獲取套接口的進程ID或進程組ID | int | |
| 文件 | FIONBIO | 設置/清除非阻塞標志 | int |
| FIOASYNC | 設置/清除異步I/O標志 | int | |
| FIONREAD | 獲取接收緩沖區中的字節數 | int | |
| FIOSETOWN | 設置文件的進程ID或進程組ID | int | |
| FIOGETOWN | 獲取文件的進程ID或進程組ID | int | |
| 接口 | SIOCGIFCONF | 獲取所有接口的列表 | struct?ifconf |
| SIOCSIFADDR | 設置接口地址 | struct?ifreq | |
| SIOCGIFADDR | 獲取接口地址 | struct?ifreq | |
| SIOCSIFFLAGS | 設置接口標志 | struct?ifreq | |
| SIOCGIFFLAGS | 獲取接口標志 | struct?ifreq | |
| SIOCSIFDSTADDR | 設置點到點地址 | struct?ifreq | |
| SIOCGIFDSTADDR | 獲取點到點地址 | struct?ifreq | |
| SIOCGIFBRDADDR?? | 獲取廣播地址 | struct?ifreq | |
| SIOCSIFBRDADDR | 設置廣播地址 | struct?ifreq | |
| SIOCGIFNETMASK | 獲取子網掩碼 | struct?ifreq | |
| SIOCSIFNETMASK | 設置子網掩碼 | struct?ifreq | |
| SIOCGIFMETRIC | 獲取接口的測度(metric) | struct?ifreq | |
| SIOCSIFMETRIC | 設置接口的測度(metric) | struct?ifreq | |
| SIOCxxx | (有很多,依賴于實現) | ||
| ARP | SIOCSARP | 創建/修改ARP項 | struct?arpreq |
| SIOCGARP | 獲取ARP項 | struct?arpreq | |
| SIOCDARP | 刪除ARP項 | struct?arpreq | |
| 路由 | SIOCADDRT | 增加路徑 | struct?rtentry |
| SIOCDELRT | 刪除路徑 | struct?rtentry | |
| 流 | I_xxx |
?
?
(1)套接口操作
- SIOCATMARK:如果套接口的讀指針當前在帶外標志上,則通過第三個參數指向的整數返回一個非零值,否則返回零。Posix.1g 用sockatmark代替了這種請求。
- SIOCGPGRP:通過第三個參數指向的整數返回為接收來自這個套接口的SIGIO或SIGURG信號而設置的進程ID或進程組ID。 這和fcntl的F_GETOWN相同。
- SIOCSPGRP:用第三個參數指向的整數設置進程ID或進程組ID以接收這個套接口的SIGIO或SIGURG信號。這和fcntl 的F_SETOWN相同。
(2)文件操作
- FIONBIO:套接口的非阻塞標志會根據第三個參數指向的值是否為零而清除或設置。等價于fcntl的F_SETFL設置/清除 O_NONBLOCK標志。
- FIOASYNC:根據第三個參數指向的值是否為零決定清除或接收套接口上的異步I/O信號。等價于fcntl的F_SETFL設置和清 除O_AYNC標志。
- FIONREAD:在第三個參數指向的整數中返回套接口接收緩沖區中當前的字節數。
- FIOSETOWN:在套接口上等價于SIOCSPGRP。
- FIOGETOWN:在套接口上等價于SIOCGPGRP。
(3)接口配置
SIOCGIFCONF:從內核中獲取系統中配置的所有接口。它使用了結構ifconf,ifconf又使用了ifreq結構。結構定義如下:
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
在調用ioctl之前分配一個緩沖區和一個ifconf結構,然后初始化后者,iotctl的第三個參數指向ifconf結構。
一個實現獲取所有接口的程序,可參見unpv12e:lib/get_ifi_info.c
?
?
(4)接口操作
- SIOCGIFCONF:從內核中獲取系統中配置的所有接口。
(5)ARP高速緩存操作
(6)路由表操作
=====================================================================================================NAME
netdevice - 底層訪問 Linux 網絡設備.總覽 (SYNOPSIS)
#include <sys/ioctl.h>?#include <net/if.h>
描述 (DESCRIPTION)
本手冊 描述 用于 配置 網絡設備 的 套接字(socket) 接口.Linux 支持 一些 配置 網絡設備 的 標準 ioctl. 他們 用于 任意的 套接字 描述符, 而 無須 了解 其 類型 或 系列. 他們 傳遞 一個?ifreq?結構:
struct ifreq{
char ifr_name[IFNAMSIZ]; /* Interface name */
union {
struct sockaddr ifr_addr;
struct sockaddr ifr_dstaddr;
struct sockaddr ifr_broadaddr;
struct sockaddr ifr_netmask;
struct sockaddr ifr_hwaddr;
short ifr_flags;
int ifr_ifindex;
int ifr_metric;
int ifr_mtu;
struct ifmap ifr_map;
char ifr_slave[IFNAMSIZ];
char ifr_newname[IFNAMSIZ];
char * ifr_data;
};
}
struct ifconf
{
int ifc_len; /* size of buffer */
union {
char * ifc_buf; /* buffer address */
struct ifreq *ifc_req; /* array of structures */
};
};
一般說來, ioctl 通過 把?ifr_name?設置為 接口 的 名字 來 指定 將要 操作 的 設備. 結構的 其他成員 可以 分享 內存.
IOCTLS
如果 某個 ioctl 標記為 特權操作, 那么 操作時 需要 有效uid 為 0, 或者 擁有?CAP_NET_ADMIN?能力. 否則 將 返回?EPERM .?
SIOCGIFNAME?
| 設備標志 | |
| IFF_UP | 接口正在運行. |
| IFF_BROADCAST | 有效的廣播地址集. |
| IFF_DEBUG | 內部調試標志. |
| IFF_LOOPBACK | 這是自環接口. |
| IFF_POINTOPOINT | 這是點到點的鏈路接口. |
| IFF_RUNNING | 資源已分配. |
| IFF_NOARP | 無arp協議, 沒有設置第二層目的地址. |
| IFF_PROMISC | 接口為雜湊(promiscuous)模式. |
| IFF_NOTRAILERS | 避免使用trailer . |
| IFF_ALLMULTI | 接收所有組播(multicast)報文. |
| IFF_MASTER | 主負載平衡群(bundle). |
| IFF_SLAVE | 從負載平衡群(bundle). |
| IFF_MULTICAST | 支持組播(multicast). |
| IFF_PORTSEL | 可以通過ifmap選擇介質(media)類型. |
| IFF_AUTOMEDIA | 自動選擇介質. |
| IFF_DYNAMIC | 接口關閉時丟棄地址. |
?
設置 活動標志字 是 特權操作, 但是 任何進程 都可以 讀取 標志字.
{
unsigned long mem_start;
unsigned long mem_end;
unsigned short base_addr;
unsigned char irq;
unsigned char dma;
unsigned char port;
};
對 ifmap 結構 的 解釋 取決于 設備驅動程序 和 體系結構.
轉載于:https://www.cnblogs.com/p2liu/archive/2010/08/06/6048827.html
總結
- 上一篇: EasyCVR调用Ehome协议接入的硬
- 下一篇: java mysql字符串拼接_Orac