什么是网络 ioctl 手册页?
Posted
技术标签:
【中文标题】什么是网络 ioctl 手册页?【英文标题】:What are the network ioctl man pages? 【发布时间】:2011-02-08 17:10:57 【问题描述】:我想使用 ioctl SIOCGIFADDR 来确定 Linux 中接口的地址。我找到了一些解释如何做到这一点的网络参考资料,但似乎我的系统上应该已经有一些参考资料了。是否有描述 SIOCGIFADDR 和朋友的手册页(或其他内容)? man netdevice
很接近,但它没有相关的 ioctl。
【问题讨论】:
【参考方案1】:ioctl
s 似乎已被弃用。更好的方法(虽然方法更复杂)是使用netlink
。例如,请参阅 this article,了解如何通过 netlink 列出所有接口(有关 ioctl
版本,请参阅该文章迷你系列的 part 2)。还有一些库可以更轻松地与netlink
交互,例如libnl 和libmnl。另见this SO question。
编辑: Here's an example 关于如何通过 netlink 获取所有接口的 IP 地址。
【讨论】:
aix 最接近回答我的实际问题,但你明白了,所以请投赞成票。您链接到的 SO question 建议将 getifaddrs 作为替代方案,并且它有一个不错的联机帮助页,因此这似乎是以一种不混淆的方式执行此操作的最不痛苦的方法。【参考方案2】:我能在我的 Ubuntu 系统上找到的最接近的(通过使用手册页和头文件)是 man ioctl_list
,它将调用列为:
0x00008915 SIOCGIFADDR struct ifreq * // I-O
有问题的结构 (ifreq
) 在 /usr/include/net/if.h
中声明,并附有解释每个字段含义的简短 cmets。
/* Interface request structure used for socket ioctl's. All interface
ioctl's must have parameter definitions which begin with ifr_name.
The remainder may be interface specific. */
struct ifreq
# define IFHWADDRLEN 6
# define IFNAMSIZ IF_NAMESIZE
union
char ifrn_name[IFNAMSIZ]; /* Interface name, e.g. "en0". */
ifr_ifrn;
union
struct sockaddr ifru_addr;
struct sockaddr ifru_dstaddr;
struct sockaddr ifru_broadaddr;
struct sockaddr ifru_netmask;
struct sockaddr ifru_hwaddr;
short int ifru_flags;
int ifru_ivalue;
int ifru_mtu;
struct ifmap ifru_map;
char ifru_slave[IFNAMSIZ]; /* Just fits the size */
char ifru_newname[IFNAMSIZ];
__caddr_t ifru_data;
ifr_ifru;
;
# define ifr_name ifr_ifrn.ifrn_name /* interface name */
# define ifr_hwaddr ifr_ifru.ifru_hwaddr /* MAC address */
# define ifr_addr ifr_ifru.ifru_addr /* address */
# define ifr_dstaddr ifr_ifru.ifru_dstaddr /* other end of p-p lnk */
# define ifr_broadaddr ifr_ifru.ifru_broadaddr /* broadcast address */
# define ifr_netmask ifr_ifru.ifru_netmask /* interface net mask */
# define ifr_flags ifr_ifru.ifru_flags /* flags */
# define ifr_metric ifr_ifru.ifru_ivalue /* metric */
# define ifr_mtu ifr_ifru.ifru_mtu /* mtu */
# define ifr_map ifr_ifru.ifru_map /* device map */
# define ifr_slave ifr_ifru.ifru_slave /* slave device */
# define ifr_data ifr_ifru.ifru_data /* for use by interface */
# define ifr_ifindex ifr_ifru.ifru_ivalue /* interface index */
# define ifr_bandwidth ifr_ifru.ifru_ivalue /* link bandwidth */
# define ifr_qlen ifr_ifru.ifru_ivalue /* queue length */
# define ifr_newname ifr_ifru.ifru_newname /* New name */
# define _IOT_ifreq _IOT(_IOTS(char),IFNAMSIZ,_IOTS(char),16,0,0)
# define _IOT_ifreq_short _IOT(_IOTS(char),IFNAMSIZ,_IOTS(short),1,0,0)
# define _IOT_ifreq_int _IOT(_IOTS(char),IFNAMSIZ,_IOTS(int),1,0,0)
除了上述之外,我觉得网络是你最好的选择。
【讨论】:
【参考方案3】:ioctl_list(2)
【讨论】:
这一定是 linux 附带的最过时的联机帮助页,“[ ... ] Linux/i386 内核 1.3.27 中的 ioctl 调用列表。”。是的,即使是最新/最伟大的发行版仍然有那个。【参考方案4】:netintro(4) 有一个最小的摘要。可惜它在 linux 上不可用
【讨论】:
以上是关于什么是网络 ioctl 手册页?的主要内容,如果未能解决你的问题,请参考以下文章