2006-07-04 [長年日記]

_ [Programming][Systemcall] インターフェースの IP アドレスの取得方法

インターフェイス(NIC)から IPアドレスを取得する方法。こちらのページを参考にする。

ioctl を使用して IPアドレスを取得する。

 fd = socket(AF_INET, SOCK_DGRAM, 0);
 /* IPv4のIPアドレスを取得したい */
 ifr.ifr_addr.sa_family = AF_INET;
 /* eth0のIPアドレスを取得したい */
 strncpy(ifr.ifr_name, "eth0", IFNAMSIZ-1);
 ioctl(fd, SIOCGIFADDR, &ifr);
 close(fd);
 /* 結果を表示 */
 printf("%s\n", inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr));
ioctl はデバイスと会話するためのシステムコールって聞いたけど、いまいちピンとこないなぁ。ま、そのうちわかんだろー。
本日のツッコミ(全9件) [ツッコミを入れる]
_ おだわら (2006-07-05 11:04)

おれもリンク先を参考にしてそのプログラム書きましたよ。<br>でも、このサンプルの問題はインターフェイスが固定されるという点。eth0以外を取りたいときにちょっと面倒なんですよね。

_ Narupon (2006-07-05 21:50)

今回のはハードが固定されているからこれで済んだけど。<br>そうだなぁ。<br>strncpy(ifr.ifr_name, INTERFACE, IFNAMSIZ-1);<br>とやって、<br>コンパイル時に <br> -DINTERFACE "eth1"<br>とオプション付けるのがアドホックなやりかたかなぁ。<br><br>それがいやなら、ifconfig のソースをみてやりかたを学ぶとか。

_ geekなぺーじ管理人 (2006-07-05 23:06)

ネットワークインターフェース一覧取得<br>http://www.geekpage.jp/programming/linux-network/get-iflist.php<br><br>を書いてみました。

_ Narupon (2006-07-05 23:28)

ありがとうございます。<br><br>ifconfigのソースをちょろっと見たところ、 struct ifconf は使用せずに取得しているようでした。(FreeBSD ソースだから多少ちがうのかも?)<br>いろいろな手法があるんですね。<br><br>これからも、geekなぺーじを活用させていただきます。

_ geekなぺーじ管理人 (2006-07-05 23:47)

最近はfreebsdをいじっていないので記憶が曖昧なんですが、freebsdはsysctlでとってましたっけ?

_ Narupon (2006-07-06 00:24)

ちょっとわからんです(^^;<br>調べて御報告します。

_ geekなぺーじ管理人 (2006-07-06 00:27)

ifconfig.cのここらへんですね。<br><br> mib[0] = CTL_NET;<br> mib[1] = PF_ROUTE;<br> mib[2] = 0;<br> mib[3] = 0; /* address family */<br> mib[4] = NET_RT_IFLIST;<br> mib[5] = ifindex; /* interface index */<br><br> /* if particular family specified, only ask about it */<br> if (afp != NULL)<br> mib[3] = afp->af_af;<br><br> if (sysctl(mib, 6, NULL, &needed, NULL, 0) < 0)<br> errx(1, "iflist-sysctl-estimate");<br> if ((buf = malloc(needed)) == NULL)<br> errx(1, "malloc");<br> if (sysctl(mib, 6, buf, &needed, NULL, 0) < 0) {<br> if (errno == ENOMEM && count++ < 10) {<br> warnx("Routing table grew, retrying");<br> free(buf);<br> sleep(1);<br> goto retry;<br> }<br> errx(1, "actual retrieval of interface table");<br> }<br><br>おさわがせしました。おやすみなさい。<br>がんばってください。

_ おだわら (2006-07-06 00:51)

おおっ。なにやらすごい方からコメントを頂いていますね。<br>いつも参考にさせて頂いております。これからもよろしくお願いします。

_ geekなぺーじ管理人 (2006-07-06 00:54)

こちらこそよろしくお願いいたします。

[]

«前の日記(2006-06-30) 最新 次の日記(2006-08-01)»