[Armadillo:00007] Re: Armadillo-J でのIPアドレス取得について
Yukihisa Hara
email@hidden
2004年 5月 17日 (月) 23:21:24 JST
御世話様です。
御陰様で、スマートにIPアドレスを取得する事が出来ました。下記にネットを検索して得られたソースを元に変更したプログラムを記します。
# 常識かと思いますが、後の方の参考まで
On 2004/05/14, at 15:09, Joe wrote:、
> 私はホストのIPアドレスを取得する場合、
> SIOCGIFADDRを指定してioctlを呼び出しています。
--
以上
C-----------------------------------------------------
C 川田工業株式会社 航空・機械事業部ロボティックス部
C 原 幸久(email@hidden)
C 〒321-3325 栃木県芳賀郡芳賀町芳賀台122-1
C tel 028-677-5622 fax 028-677-5622
C-----------------------------------------------------
/*
* ipofif.c
*
* get the ip address of an interface
*
* Angus Mackay
*/
#ifdef HAVE_CONFIG_H
# include <config.h>
#else
# ifdef __SVR4
# define HAVE_SYS_SOCKIO_H 1
# endif
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <net/if.h>
#ifdef HAVE_SOCKIO_H
# include <sys/sockio.h>
#endif
/* with aliasing this is actually conservative */
#define MAX_IFACES 256
/**************************************************/
static char *program_name = NULL;
/**************************************************/
//================================================================
int get_if_addr(int sock, char *name, char *ipAddr)
//================================================================
{
//--------------------//
struct ifreq ifr;
int close_sock = 0;
struct sockaddr_in sin;
//--------------------//
memset(&sin, 0, sizeof(sin));
/* create our own socket if we don't get one passed in */
if(sock == -1)
{
sock = socket(AF_INET, SOCK_STREAM, 0);
if(sock == -1)
{
return -1;
}
close_sock = 1;
}
memset(&ifr, 0, sizeof(ifr));
strcpy(ifr.ifr_name, name);
if(ioctl(sock, SIOCGIFADDR, &ifr) < 0)
{
perror("ioctl(SIOCGIFADDR)");
memset(&sin, 0, sizeof(struct sockaddr_in));
goto ERR;
}
#ifdef __linux__
/* why does this need to be done twice? */
if(ioctl(sock, SIOCGIFADDR, &ifr) < 0)
{
perror("ioctl(SIOCGIFADDR)");
memset(&sin, 0, sizeof(struct sockaddr_in));
goto ERR;
}
#endif
if(ifr.ifr_addr.sa_family == AF_INET)
{
memcpy(&sin, &(ifr.ifr_addr), sizeof(struct sockaddr_in));
//fprintf(stderr, "%s: %s\n", name, inet_ntoa(sin.sin_addr));
strcpy(ipAddr, inet_ntoa(sin.sin_addr));
}
else
{
memset(&sin, 0, sizeof(struct sockaddr_in));
/* fprintf(stderr, "%s: %s\n", name, "could not resolve"); */
goto ERR;
}
if(close_sock) { close(sock); }
return 0;
ERR:
if(close_sock) { close(sock); }
return -1;
}
//-------------------------------------------------------------
int main( int argc, char **argv )
{
int i;
char ipAddr[17];
program_name = argv[0];
if(argc > 1)
{
for(i=1; i<argc; i++)
{
if(get_if_addr(-1, "eth0", ipAddr) == 0)
{
fprintf(stderr, "%s\n", ipAddr);
}
}
}
return 0;
}
armadillo メーリングリストの案内