[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 メーリングリストの案内