インターフェイス(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 はデバイスと会話するためのシステムコールって聞いたけど、いまいちピンとこないなぁ。ま、そのうちわかんだろー。
おれもリンク先を参考にしてそのプログラム書きましたよ。<br>でも、このサンプルの問題はインターフェイスが固定されるという点。eth0以外を取りたいときにちょっと面倒なんですよね。
今回のはハードが固定されているからこれで済んだけど。<br>そうだなぁ。<br>strncpy(ifr.ifr_name, INTERFACE, IFNAMSIZ-1);<br>とやって、<br>コンパイル時に <br> -DINTERFACE "eth1"<br>とオプション付けるのがアドホックなやりかたかなぁ。<br><br>それがいやなら、ifconfig のソースをみてやりかたを学ぶとか。
ネットワークインターフェース一覧取得<br>http://www.geekpage.jp/programming/linux-network/get-iflist.php<br><br>を書いてみました。
ありがとうございます。<br><br>ifconfigのソースをちょろっと見たところ、 struct ifconf は使用せずに取得しているようでした。(FreeBSD ソースだから多少ちがうのかも?)<br>いろいろな手法があるんですね。<br><br>これからも、geekなぺーじを活用させていただきます。
最近はfreebsdをいじっていないので記憶が曖昧なんですが、freebsdはsysctlでとってましたっけ?
ちょっとわからんです(^^;<br>調べて御報告します。
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>がんばってください。
おおっ。なにやらすごい方からコメントを頂いていますね。<br>いつも参考にさせて頂いております。これからもよろしくお願いします。
こちらこそよろしくお願いいたします。