今回は保有するインタフェースの
IPv6を取得して標準出力させてみます。
インタフェースを操作するための
ioctlシステムコールを使うことで、
指定したインタフェースに割り当てられた
IPv4アドレスを容易に取得出来ます。
ioctlでIPv6アドレスも取得出来ますが、
少し複雑なので、ioctlを使わないで
取得してそれを標準出力していきます。
/proc/net/if_inet6 にホストが保有する
インタフェースに割り当てられた
IPv6アドレスが保存されています。
実際に見てみましょう。
cat /proc/net/if_inet6 と叩きます。
次のように表示されました。

xxdコマンドでダンプすると次のようになります。
xxd /proc/net/if_inet6

ここで if_inet6 についてもう少し掘り下げてみます。
if_inet6のフォーマット
1行が各インタフェースに関する情報です。
まず1行目に関して、
"アドレス" "01" "80" "10" "80" "lo"
と5つのパートから構成されています。
各値に関して以下の意味があります。
アドレス:IPv6 Address
01:Interface Index
80:Prefix Length
10:Scope Value
80:Interface Flag
lo:Device Name
プレフィックスやスコープに関しては、
IPv6アドレスの概念の1つです。
インデックスはソケットプログラミングを
経験したことがある方は分かると思いますが、
bind()をするために、必要な情報です。
今回必要な情報は、
IPv6アドレスとデバイス名です。
Cで/proc/net/if_inet6からIPv6アドレスを取得する
コードはこちらです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
#include<stdio.h> #include<fcntl.h> #include<unistd.h> #define IF_IPV6 "/proc/net/if_inet6" //ディレクトリ #define IPV6_RAW_FORMAT "%32s %x %x %x %x %5s" //フォーマット int main(void){ char addr[32]; char device[5]; int index, prefix, scope, flag; FILE *fp; fp = fopen(IF_IPV6, "r"); if(fp==NULL){ perror("[-]fopen(r)"); return -1; } while(fscanf(fp, IPV6_RAW_FORMAT, addr, &index, &prefix, &scope, &flag, device)!=EOF){ printf("<%5s> %s\n", device, addr); } printf("\n"); fclose(fp); return 0; } |
これを実行すると次のようになります。

しっかりと表示出来ていますね。
ちなみに lo はループバックアドレスで
eth1 はリンクローカルアドレスを表してます。
最後まで読んでいただきありがとうございました。