2008年8月21日木曜日

IPアドレスの求め方

Linuxのプログラム内で自IPアドレスを知りたいとき、
シェルスクリプトだとifconfigの結果をsedで加工して取り出したりします。
まあ、
ifconfig eth0 | grep 'inet addr' | sed -e 's/.*inet addr:\([^ ]*\) .*/\1/'

な感じでしょうか。
もしまじめ(?)に取得するなら以下のようにします。
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <ifaddrs.h>

int main(void)
{
struct ifaddrs *a,*b;
char ip[INET6_ADDRSTRLEN];

if(getifaddrs(&a)!=0)
return;
for(b=a;b!=NULL;b=b->ifa_next){
if(b->ifa_addr->sa_family==AF_INET6){
inet_ntop(AF_INET6,&(((struct sockaddr_in6*)(b->ifa_addr))->sin6_addr),ip,sizeof(ip));
printf("%s\t%s\n",b->ifa_name,ip);
}
else if(b->ifa_addr->sa_family==AF_INET){
inet_ntop(AF_INET,&(((struct sockaddr_in*)(b->ifa_addr))->sin_addr),ip,sizeof(ip));
printf("%s\t%s\n",b->ifa_name,ip);
}
}
freeifaddrs(a);
}

他にもこんな方法もあります。
#include <stdio.h>
#include <string.h>
#include <sys/ioctl.h>
#include <netinet/in.h>
#include <net/if.h>

int main(void)
{
int s;
struct ifreq ifr;
char ip[INET_ADDRSTRLEN];

s=socket(AF_INET,SOCK_DGRAM,0);
ifr.ifr_addr.sa_family=AF_INET;
strncpy(ifr.ifr_name,"eth0",IFNAMSIZ-1);
ioctl(s,SIOCGIFADDR,&ifr);
inet_ntop(AF_INET,&(((struct sockaddr_in*)&ifr.ifr_addr)->sin_addr),ip,sizeof(ip));
printf("%s\t%s\n",ifr.ifr_name,ip);
close(s);
}


ところで、VxWorks 6.x ではこんな感じですね。
#include <net/ifaddrs.h>
#include <netinet/in.h>
#include <arpa/inet.h>
void main(void)
{
struct ifaddrs *a,*b;
char ip[INET6_ADDRSTRLEN];

if(getifaddrs(&a)!=0)
return;
for(b=a;b!=NULL;b=b->ifa_next){
if(((struct sockaddr_in6*)(b->ifa_addr))->sin6_family==AF_INET6){
inet_ntop(AF_INET6,&(((struct sockaddr_in6*)(b->ifa_addr))->sin6_addr),ip,sizeof(ip));
printf("%s\t%s\n",b->ifa_name,ip);
}
else if(((struct sockaddr_in*)(b->ifa_addr))->sin_family==AF_INET){
inet_ntop(AF_INET,&(((struct sockaddr_in*)(b->ifa_addr))->sin_addr),ip,sizeof(ip));
printf("%s\t%s\n",b->ifa_name,ip);
}
}
freeifaddrs(a);
}

0 件のコメント:

コメントを投稿