转自:http://blog.csdn.net/firo_baidu/archive/2011/01/03/6114257.aspx
缅怀Stevens大师。
1.师从互联网。
2.UNP v1第17章。
3.Linux man 命令:ioctl和ioctl_list。
ioctl函数的功能是管理底层特殊文件设备的参数。ioctl函数的部分功能可由一些POSIX的库函数替代,部分功能和fcntl重合!另外参见这里:http://vic295.blog.163.com/blog/static/74033530200991974322689/
#include <sys/ioctl.h>
int ioctl(int fd, int request, ...);//返回值:成功:0、失败:-1.
ioctl的第三个参数根据request确定。UNPv1中把和网络相关的参数request(请求)分为6类:
1.Socket 。2.File。3.Interface。4.RARP/ARP。5.Route。(6.STREAMS。不讨论!!STREAMS已被Linus拒绝加入内核,有Linux版的实现Lis,大家可以试试。)
SIOCATMARK: 是否位于带外标记。
SIOCGPGRP:设置socket的PID和PGID。
SIOCSPGRP:获取socket的PID和PGID。
SIOCGSTAMPNS:Get stamp (timespec)
SIOCGSTAMP:Get stamp (timeval)
使用时添加sys/socket.h
FIONBIO:设置/清除非阻塞I/O标志。
FIOASYNC:设置/清除信号驱动异步I/O标志。
FIONREAD:获取缓冲区的字节数。
使用时添加sys/ioctl.h
FIOSETOWN:设置文件的PID和PGID。
FIOGETOWN:获取文件的PID和PGID。
使用时添加sys/socket.h
#define SIOCGIFADDR 0x8915 /* get PA address */Public Address
SIOC`X`IF`XXXX`参见bits/ioctl.h
使用时添加sys/ioctl.h
相关数据结构struct ifconf和struct ifreq 添加net/if.h关于这两个结构大家看这里:http://blog.csdn.net/wl_haanel/archive/2009/09/09/4536236.aspx
使用范例:
struct ifreq ifr;
ioctl(socket_fd, SIOCGIFADDR, &ifr);//ifr.ifr_addr返回的就是本机IP地址。
/* ARP cache control calls. */ /* 0x8950 - 0x8952 * obsolete calls, don't re-use */
#define SIOCDARP 0x8953 /* delete ARP table entry */删除ARP表项
#define SIOCGARP 0x8954 /* get ARP table entry */获取ARP表项
#define SIOCSARP 0x8955 /* set ARP table entry */创建和设置ARP表项
使用时添加sys/ioctl.h
相关数据结构struct arpreq 添加net/if_arp.h
/* RARP cache control calls. */
#define SIOCDRARP 0x8960 /* delete RARP table entry */
#define SIOCGRARP 0x8961 /* get RARP table entry */
#define SIOCSRARP 0x8962 /* set RARP table entry */
使用时添加sys/ioctl.h
/* Routing table calls. */
#define SIOCADDRT 0x890B /* add routing table entry */增加路径
#define SIOCDELRT 0x890C /* delete routing table entry */删除路径
#define SIOCRTMSG 0x890D /* call to routing system */
使用时添加sys/ioctl.h
相关数据结构struct rtentry 添加net/route.h