With thanks to Erica Sadun (iPhone cookbook) and gandreas and valexa on the iPhone dev forums I was able to create the following function. The function
iterates over the IPs of the phone using getifaddrs(&addrs)
. if getWiFiIPAddress
finds "en0
"
in the list interface addresses (ifaddrs
) it will return the ethernet adapter zero (en0
) IP address as a NSSring*
. If no address
is found the function will return NULL.
//------- includes
#include <ifaddrs.h>
#include
<
arpa/inet.h
>
#include
<
sys/types.h
>
#include
<
sys/socket.h
>
#include
<
net/if.h
>
#include
<
net/if_dl.h
>
#include
<
arpa/inet.h
>
#include
<
ifaddrs.h
>
#if ! defined(IFT_ETHER)
#define IFT_ETHER 0x6/* Ethernet CSMACD */
#endif
//------- Implementation
- (NSString*)getWiFiIPAddress
{
BOOL success;
struct ifaddrs * addrs;
const struct ifaddrs * cursor;
success = getifaddrs(&addrs) == 0;
if (success) {
cursor = addrs;
while (cursor != NULL) {
if (cursor->ifa_addr->sa_family == AF_INET && (cursor->ifa_flags & IFF_LOOPBACK) == 0) // this second test keeps from picking up the loopback address
{
NSString *name = [NSString stringWithUTF8String:cursor->ifa_name];
if ([name isEqualToString:@"en0"]) { // found the WiFi adapter
return [NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)cursor->ifa_addr)->sin_addr)];
}
}
cursor = cursor->ifa_next;
}
freeifaddrs(addrs);
}
return NULL;
}
PS: I need a better blog, that support snippets - comments?
I tossed your code into an app I have and got lots of errors. Could you include the headers that are required to get this to work?
ReplyDeleteNote that I did find these locations but I don't know enough about networking on linux or the mac to reduce this list:
ReplyDelete#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <net/if.h>
#include <ifaddrs.h>
included includes - ooops. sorry 'bout that.
ReplyDeleteI'm gald to see this method.
ReplyDeleteIt's a perfect solution about my problem.
Thank you!
Thanks for the code! The code fixed my problem.
ReplyDeleteI think you may have a memory leak if you don't call freeifaddrs(addrs) before returning the string.
ReplyDeleteHas anyone managed to pass Apple app approval process for an application whci uses this code?
ReplyDeleteAnonymous on Apr 14th was right. It does have a memory leak.. also it's bad programming practice to have a return from in the middle of your code.
ReplyDeleteTry this.
+ (NSString *) localWiFiIPAddress
{
BOOL success;
struct ifaddrs * addrs;
const struct ifaddrs * cursor;
NSString *address = nil;
success = getifaddrs(&addrs) == 0;
if (success) {
cursor = addrs;
while (cursor != NULL) {
// the second test keeps from picking up the loopback address
if (cursor->ifa_addr->sa_family == AF_INET && (cursor->ifa_flags & IFF_LOOPBACK) == 0)
{
NSString *name = [NSString stringWithUTF8String:cursor->ifa_name];
if ([name isEqualToString:@"en0"]) // Wi-Fi adapter
{
address = [NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)cursor->ifa_addr)->sin_addr)];
break;
}
}
cursor = cursor->ifa_next;
}
freeifaddrs(addrs);
}
return address;
}
Thanks jon, that's a proper code , now memory leak is fixed !
DeleteIs there a IPV6 version of it?
ReplyDeleteCool and I have a super offer you: Who House Renovation contractors for home additions near me
ReplyDelete