17.1 在 17.7 节中我们说过,由 SIOCGIFBRDADDR 请求返回的广播地址是通过 ifreq 结构的 ifr_broadaddr 成员返回的。然而查看 TCPv2 第 173 页,我们注意到它是在 ifr_dstaddr 成员中返回的。这里有问题吗?
- 没关系,因为这是个 union
17.2 修改 get_ifi_info 函数,当发出第一个 SIOCGIFCONF 请求时指定缓冲区的大小 (由 ifconf 结构的 ifc_len 成员指定)为只能容纳一个 ifreq 结构,以后每回循环时指定缓冲区的大小为新增 1 个 ifreq 结构的容量。然后在循环体中增加一些语句,以显示每回发出请求时指定的哈 u 你丑姑娘去大小以及 ioctl 是否返回错误,若成功返回则显示返回的缓冲区长度。运行 prifinfo 程序,查看你自己的系统在缓冲区太小时如何处理这样的请求。对于由 ioctl 返回的其他地址族并非所期望值的任何套接字地址结构,页显示其地址族值,以便了解你的系统返回了哪些其他结构。
-
运行结果如下:
➜ progs git:(master) ✗ ./a.out 30
tips : IFNAMSIZ = 16
sockaddr_in6 = 28
sockaddr_dl = 20
sockaddr_storage = 128
sockaddr = 16
sockaddr_in = 16
sockaddr_un = 106
union ifr_ifru = 16
memory size from kernel to user : 0
name : p8����
0
➜ progs git:(master) ✗ ./a.out 41
tips : IFNAMSIZ = 16
sockaddr_in6 = 28
sockaddr_dl = 20
sockaddr_storage = 128
sockaddr = 16
sockaddr_in = 16
sockaddr_un = 106
union ifr_ifru = 16
memory size from kernel to user : 36
name : lo0
sa_family = AF_LINK
➜ progs git:(master) ✗ ./a.out 90
tips : IFNAMSIZ = 16
sockaddr_in6 = 28
sockaddr_dl = 20
sockaddr_storage = 128
sockaddr = 16
sockaddr_in = 16
sockaddr_un = 106
union ifr_ifru = 16
memory size from kernel to user : 68
name : lo0
sa_family = AF_LINK