MAC:IP地址

MAC:IP地址

#import "DDMacInfo.h"

#include <ifaddrs.h>

#include <arpa/inet.h>

#include <net/if.h>



#define IOS_CELLULAR @"pdp_ip0"

#define IOS_WIFI @"en0"

#define IOS_VPN @"utun0"

#define IP_ADDR_IPv4 @"ipv4"

#define IP_ADDR_IPv6 @"ipv6"



@implementation DDMacInfo

+ (NSDictionary *)getIPAddresses
{
    
    NSMutableDictionary *addresses = [NSMutableDictionary 
dictionaryWithCapacity:8];
    
    // retrieve the current interfaces - returns 0 on success
    
    struct ifaddrs *interfaces;
    
    if(!getifaddrs(&interfaces)) {
        
        // Loop through linked list of interfaces
        
        struct ifaddrs *interface;
        
        for(interface=interfaces; interface; interface=interface-
      >ifa_next) {
            
            if(!(interface->ifa_flags & IFF_UP) /* || (interface-
          >ifa_flags & IFF_LOOPBACK) */ ) {
                
                continue; // deeply nested code harder to read
                
            }
            
            const struct sockaddr_in *addr = (const struct 
            sockaddr_in*)interface->ifa_addr;
            
            char addrBuf[ MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) ];
            
            if(addr && (addr->sin_family==
                    AF_INET || addr->sin_family==AF_INET6)) {
                
                NSString *name = [NSString 
                                 stringWithUTF8String:interface->ifa_name];
                
                NSString *type;
                
                if(addr->sin_family == AF_INET) {
                    
                    if(inet_ntop(AF_INET, &addr->sin_addr, 
                    addrBuf, INET_ADDRSTRLEN)) {
                        
                        type = IP_ADDR_IPv4;
                        
                    }
                    
                } else {
                    
                    const struct sockaddr_in6 *addr6 = (const struct 
                    sockaddr_in6*)interface->ifa_addr;
                    
                    if(inet_ntop(AF_INET6, &addr6->sin6_addr, 
                    addrBuf, INET6_ADDRSTRLEN)) {
                        
                        type = IP_ADDR_IPv6;
                        
                    }
                    
                }
                
                if(type) {
                    
                    NSString *key = [NSString 
                                    stringWithFormat:@"%@/%@", name, type];
                    
                    addresses[key] = [NSString 
                                     stringWithUTF8String:addrBuf];
                    
                }
                
            }
            
        }
        
        // Free memory
        
        freeifaddrs(interfaces);
        
    }
    
    return [addresses count] ? addresses : nil;
    
}


@end


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容