Advertise here




Advertise here

Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!

Sign In with Google Sign In with OpenID

Get current IP address

JumeJume Posts: 264Registered Users
how?

thanks,
Jume
Post edited by Jume on

Replies

  • gradhagradha Posts: 10Registered Users
    edited October 2008
    Haven't tried it myself, but this might tell you how: Day 4.
  • JumeJume Posts: 264Registered Users
    edited October 2008
    gradha wrote: »
    Haven't tried it myself, but this might tell you how: Day 4.

    figured it out later today with some lo level network code, but will definitely look at this. I guess there must be an easier way of finding it then how I did it. I'll also post my code if anyone's interested.

    Thanks gradha,
    Jume
  • Software-Diner.deSoftware-Diner.de Posts: 52Registered Users
    edited October 2008
    I would be interested...the "day-4-code" is - judged by some other posts - not the "officially supported way"...at least they say so :-)

    Just in case it wont survive the next OS or SDK update it would be cool to have another way to get your own ip!
  • JumeJume Posts: 264Registered Users
    edited October 2008
    I would be interested...the "day-4-code" is - judged by some other posts - not the "officially supported way"...at least they say so :-)

    Just in case it wont survive the next OS or SDK update it would be cool to have another way to get your own ip!

    I'll post my code tomorrow when I'm back in the office. Actually my could also be stop working at some time, you never know what apple does with next SDK release.
  • JumeJume Posts: 264Registered Users
    edited October 2008
    Ok so here we go. I used some code that was running for macs and changed it so it is working on iPhone to to get the local IP addresses from iPhone.

    It's simply C. So to get started I created IPAddress.h and IPAddress.c

    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 <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    #include <sys/ioctl.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <netdb.h>
    #include <arpa/inet.h>
    #include <sys/sockio.h>
    #include <net/if.h>
    #include <errno.h>
    #include <net/if_dl.h>
    
    #include "GetAddresses.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<MAXADDRS; ++i)
    	{
    		if_names[i] = ip_names[i] = hw_addrs[i] = NULL;
    		ip_addrs[i] = 0;
    	}
    }
    
    void FreeAddresses()
    {
    	int i;
    	for (i=0; i<MAXADDRS; ++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<MAXADDRS; ++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<MAXADDRS; ++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<MAXADDRS; ++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);
    }
    


    And then I use it like this in myAppDelegate

    MyAppAppDelegate.h
    #import <UIKit/UIKit.h>
    
    @interface MyAppAppDelegate : NSObject <UIApplicationDelegate> {
    	NSString *localIP;
    }
    
    @property (nonatomic, retain) NSString *localIP;
    
    - (NSString *)deviceIPAdress;
    
    @end
    
    


    MyAppDelegate.m
    - (void)applicationDidFinishLaunching:(UIApplication *)application {
    	self.localIP = [self deviceIPAdress];
    
            ...
    }
    
    - (NSString *)deviceIPAdress {
    	InitAddresses();
    	GetIPAddresses();
    	GetHWAddresses();
    	
            /* 
    	int i;
    	NSString *deviceIP;
    	for (i=0; i<MAXADDRS; ++i)
    	{
    		static unsigned long localHost = 0x7F000001;		// 127.0.0.1
    		unsigned long theAddr;
    		
    		theAddr = ip_addrs[i];
    		
    		if (theAddr == 0) break;
    		if (theAddr == localHost) continue;
    		
    		NSLog(@"%s %s %s\n", if_names[i], hw_addrs[i], ip_names[i]);
    	}
    	deviceIP = [NSString stringWithFormat:@"%s", ip_names[i]];
    	*/
    	
            //this will get you the right IP from your device in format like 198.111.222.444. If you use the for loop above you will se that ip_names array will also contain localhost IP 127.0.0.1 that's why I don't use it. Eventualy this was code from mac that's why it uses arrays for ip_names as macs can have multiple IPs
    	return [NSString stringWithFormat:@"%s", ip_names[1]];
    }
    
    
  • Software-Diner.deSoftware-Diner.de Posts: 52Registered Users
    edited October 2008
    Jume,

    thanks for sharing this. I understand now why you think this seems complicated... :-)

    But I think it will help nevertheless...it's always good to see other solutions to learn how things can be done!

    bye, Markus.
  • JumeJume Posts: 264Registered Users
    edited October 2008
    Jume,

    thanks for sharing this. I understand now why you think this seems complicated... :-)

    But I think it will help nevertheless...it's always good to see other solutions to learn how things can be done!

    bye, Markus.

    Network code on Mac is always complicated :). But this definitely works and I think should work as it really uses basic C socket functions.
  • gradhagradha Posts: 10Registered Users
    edited October 2008
    Looking through the docs it looked like the official way to get the host address would be to use Core Foundation's CFHost, which OTOH is possibly a prettier version of the C code you just posted.
  • dietrichuhldietrichuhl Posts: 30Registered Users
    edited February 2009
    Jume wrote: »
    Network code on Mac is always complicated :). But this definitely works and I think should work as it really uses basic C socket functions.

    I have not had my C programming Hat on in years.
    Does this code pull the available connections in the process of determining your IP address?

    I’m trying to simply see the connections available or otherwise that exist around the iDevice. I want to build a crude location marker system for iDevices that do not have GPS and are not in Location Services registered areas or do not have a wifi connection.

    I don’t need to access to the networks I just need to know what networks are around the unit. Relative strength would be a plus. But just seeing them would be a start.

    Any thoughts on where to look up code or other reference material would be appreciated.

    Thanks
    Dietrich
  • kurisukunkurisukun Posts: 9New Users
    edited May 2009
    Sorry to bring up this old question, but I've been trying to figure out how to use the "official way" to find out the iPhone's current IP address using CFHost.

    However, I haven't been able to successfully do so yet. While I'm sure the above code works, any help with the CFHost version would be much appreciated!
  • jtarajtara Posts: 406Registered Users
    edited May 2009
    I don't know that there's an "official way" to do this.

    The low-level BSD (er, Darwin, er, iPhone OS...) OS calls are fair play, and I think a lot of iPhone developers don't realize that.
  • smashersmasher Posts: 3,858Registered Users @ @ @ @ @
    edited May 2009
    kurisukun wrote: »
    Sorry to bring up this old question, but I've been trying to figure out how to use the "official way" to find out the iPhone's current IP address using CFHost.

    However, I haven't been able to successfully do so yet. While I'm sure the above code works, any help with the CFHost version would be much appreciated!

    Just curious why you want the IP address - it's going to change when someone moves from network to network, and when someone goes from cell to wifi. I hope you've planned for that situation.
  • JumeJume Posts: 264Registered Users
    edited May 2009
    kurisukun wrote: »
    Sorry to bring up this old question, but I've been trying to figure out how to use the "official way" to find out the iPhone's current IP address using CFHost.

    However, I haven't been able to successfully do so yet. While I'm sure the above code works, any help with the CFHost version would be much appreciated!

    Try this method: 31 Days of iPhone SDK Apps - Day 04: What is my IP? | Apps Amuck Blog

    it's a little shorter than my method described above ...
  • MenneisyysMenneisyys Posts: 1New Users
    edited May 2010
    Note that this NSHost-based hack doesn't seem to work under 4.0 any more. (Tested under b4.)
Sign In or Register to comment.