最近正在看《Uinx網絡編程》,看到使用ioctl獲取網卡的IPv4地址,就想着如何獲取IPv6地址?百度搜索一番也沒有找到很好的結果,突然想起前一段時間看到過使用strace跟蹤系統調用的一篇文章,就打算跟蹤一下ifconfig命令,看看ifconfig是怎樣獲取IPv6地址的
| $ strace -o out ifconfig ens33 Link encap:Ethernet HWaddr 00:50:56:3d:e2:ca inet addr:192.168.31.172 Bcast:192.168.31.255 Mask:255.255.255.0 inet6 addr: fe80::250:56ff:fe3d:e2ca/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:24774 errors:0 dropped:0 overruns:0 frame:0 TX packets:20456 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:3668629 (3.6 MB) TX bytes:15440678 (15.4 MB)
lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:320 errors:0 dropped:0 overruns:0 frame:0 TX packets:320 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1 RX bytes:23760 (23.7 KB) TX bytes:23760 (23.7 KB) |
strace命令產生的結果保存在out文件中,現在來打開它

原來ifconfig命令是從/proc/net/if_inet6文件中獲取到的IPv6地址
| $ cat /proc/net/if_net6 00000000000000000000000000000001 01 80 10 80 lo fe80000000000000025056fffe3de2ca 02 40 20 80 ens33 |
文件中的每一行記錄了一個網卡的信息,第一串數字就是十六進制的IPv6地址。
