'알아내기'에 해당되는 글 1건

  1. 2010.06.24 아이폰에서 IP주소 알아내기
아이폰어플개발정보2010. 6. 24. 11:35
아이폰에서 IP주소 알아내기

by alex 7. 9월 2009 14:31
/*

 *  IPAdress.h

 *

 *

 */

 
#define MAXADDRS 32

 
extern char *if_names[MAXADDRS];

extern char *ip_names[MAXADDRS];

extern char *hw_addrs[MAXADDRS];

extern unsigned long ip_addrs[MAXADDRS];

 
// Function prototypes

 
void InitAddresses();

void FreeAddresses();

void GetIPAddresses();

void GetHWAddresses();

/*

 *  IPAddress.c

 *

 */

 
#include "IPAddress.h"

 
#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

 
#include "IPAddress.h"

 
#define min(a,b) ((a) < (b) ? (a) : (b))

#define max(a,b) ((a) > (b) ? (a) : (b))

 
#define BUFFERSIZE 4000

 
char *if_names[MAXADDRS];

char *ip_names[MAXADDRS];

char *hw_addrs[MAXADDRS];

unsigned long ip_addrs[MAXADDRS];

 
static int   nextAddr = 0;

 
void InitAddresses()

{

 int i;

 for (i=0; i

 {

  if_names[i] = ip_names[i] = hw_addrs[i] = NULL;

  ip_addrs[i] = 0;

 }

}

 
void FreeAddresses()

{

 int i;

 for (i=0; i

 {

  if (if_names[i] != 0) free(if_names[i]);

  if (ip_names[i] != 0) free(ip_names[i]);

  if (hw_addrs[i] != 0) free(hw_addrs[i]);

  ip_addrs[i] = 0;

 }

 InitAddresses();

}

 
void GetIPAddresses()

{

 int                 i, len, flags;

 char                buffer[BUFFERSIZE], *ptr, lastname[IFNAMSIZ], *cptr;

 struct ifconf       ifc;

 struct ifreq        *ifr, ifrcopy;

 struct sockaddr_in *sin;

 
 char temp[80];

 
 int sockfd;

 
 for (i=0; i

 {

  if_names[i] = ip_names[i] = NULL;

  ip_addrs[i] = 0;

 }

 
 sockfd = socket(AF_INET, SOCK_DGRAM, 0);

 if (sockfd < 0)

 {

  perror("socket failed");

  return;

 }

 
 ifc.ifc_len = BUFFERSIZE;

 ifc.ifc_buf = buffer;

 
 if (ioctl(sockfd, SIOCGIFCONF, &ifc) < 0)

 {

  perror("ioctl error");

  return;

 }

 
 lastname[0] = 0;

 
 for (ptr = buffer; ptr < buffer + ifc.ifc_len; )

 {

  ifr = (struct ifreq *)ptr;

  len = max(sizeof(struct sockaddr), ifr->ifr_addr.sa_len);

  ptr += sizeof(ifr->ifr_name) + len; // for next one in buffer

  
  if (ifr->ifr_addr.sa_family != AF_INET)

  {

   continue; // ignore if not desired address family

  }

  
  if ((cptr = (char *)strchr(ifr->ifr_name, ':')) != NULL)

  {

   *cptr = 0;  // replace colon will null

  }

  
  if (strncmp(lastname, ifr->ifr_name, IFNAMSIZ) == 0)

  {

   continue; /* already processed this interface */

  }

  
  memcpy(lastname, ifr->ifr_name, IFNAMSIZ);

  
  ifrcopy = *ifr;

  ioctl(sockfd, SIOCGIFFLAGS, &ifrcopy);

  flags = ifrcopy.ifr_flags;

  if ((flags & IFF_UP) == 0)

  {

   continue; // ignore if interface not up

  }

  
  if_names[nextAddr] = (char *)malloc(strlen(ifr->ifr_name)+1);

  if (if_names[nextAddr] == NULL)

  {

   return;

  }

  strcpy(if_names[nextAddr], ifr->ifr_name);

  
  sin = (struct sockaddr_in *)&ifr->ifr_addr;

  strcpy(temp, inet_ntoa(sin->sin_addr));

  
  ip_names[nextAddr] = (char *)malloc(strlen(temp)+1);

  if (ip_names[nextAddr] == NULL)

  {

   return;

  }

  strcpy(ip_names[nextAddr], temp);

  
  ip_addrs[nextAddr] = sin->sin_addr.s_addr;

  
  ++nextAddr;

 }

 
 close(sockfd);

}

 
void GetHWAddresses()

{

 struct ifconf ifc;

 struct ifreq *ifr;

 int i, sockfd;

 char buffer[BUFFERSIZE], *cp, *cplim;

 char temp[80];

 
 for (i=0; i

 {

  hw_addrs[i] = NULL;

 }

 
 sockfd = socket(AF_INET, SOCK_DGRAM, 0);

 if (sockfd < 0)

 {

  perror("socket failed");

  return;

 }

 
 ifc.ifc_len = BUFFERSIZE;

 ifc.ifc_buf = buffer;

 
 if (ioctl(sockfd, SIOCGIFCONF, (char *)&ifc) < 0)

 {

  perror("ioctl error");

  close(sockfd);

  return;

 }

 
 ifr = ifc.ifc_req;

 
 cplim = buffer + ifc.ifc_len;

 
 for (cp=buffer; cp < cplim; )

 {

  ifr = (struct ifreq *)cp;

  if (ifr->ifr_addr.sa_family == AF_LINK)

  {

   struct sockaddr_dl *sdl = (struct sockaddr_dl *)&ifr->ifr_addr;

   int a,b,c,d,e,f;

   int i;

   
   strcpy(temp, (char *)ether_ntoa(LLADDR(sdl)));

   sscanf(temp, "%x:%x:%x:%x:%x:%x", &a, &b, &c, &d, &e, &f);

   sprintf(temp, "%02X:%02X:%02X:%02X:%02X:%02X",a,b,c,d,e,f);

   
   for (i=0; i

   {

    if ((if_names[i] != NULL) && (strcmp(ifr->ifr_name, if_names[i]) == 0))

    {

     if (hw_addrs[i] == NULL)

     {

      hw_addrs[i] = (char *)malloc(strlen(temp)+1);

      strcpy(hw_addrs[i], temp);

      break;

     }

    }

   }

  }

  cp += sizeof(ifr->ifr_name) + max(sizeof(ifr->ifr_addr), ifr->ifr_addr.sa_len);

 }

 
 close(sockfd);

}

//Somewhere in your code

- (NSString *)deviceIPAdress {

 InitAddresses();

 GetIPAddresses();

 GetHWAddresses();

 return [NSString stringWithFormat:@"%s", ip_names[1]];

}

 
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.

- (void)viewDidLoad {

    [super viewDidLoad];

    ipAddress.text = [self deviceIPAdress];

}



출처 : http://blog.naver.com/PostView.nhn?blogId=amoros21&logNo=140107111097

'아이폰어플개발정보' 카테고리의 다른 글

openGL texture 만들기  (0) 2010.06.24
UIImage 를 NSData로 변환하는 방법  (0) 2010.06.24
아이폰에서 IP주소 알아내기  (0) 2010.06.24
Print CGRect  (0) 2010.06.24
흔드는거 감지하기  (0) 2010.06.24
뒤로가기 버튼 없애기  (0) 2010.06.24
Posted by 오늘마감

댓글을 달아 주세요