iOSはネイティブのIPアドレスを取得する

2036 ワード

ローカルでアクセスするネットワークのIPアドレスを直接取得して、話は多くなくて、直接コードに行きます

- (NSString*)getDeviceIPAddress

{
    
    int sockfd =socket(AF_INET,SOCK_DGRAM,0);
    
    // if (sockfd < 0) return nil;
    
    NSMutableArray*ips = [NSMutableArray array];
    
    int BUFFERSIZE =4096;
    
    struct ifconf ifc;
    
    char buffer[BUFFERSIZE], *ptr, lastname[IFNAMSIZ], *cptr;
    
    struct ifreq*ifr, ifrcopy;
    
    ifc.ifc_len= BUFFERSIZE;
    
    ifc.ifc_buf= buffer;
    
    if(ioctl(sockfd,SIOCGIFCONF, &ifc) >=0){
        
        for(ptr = buffer; ptr < buffer + ifc.ifc_len; ){
            
            ifr = (struct ifreq*)ptr;
            
            int len =sizeof(struct sockaddr);
            
            if(ifr->ifr_addr.sa_len> len) {
                
                len = ifr->ifr_addr.sa_len;
                
            }
            
            ptr +=sizeof(ifr->ifr_name) + len;
            
            if(ifr->ifr_addr.sa_family!=AF_INET)continue;
            
            if((cptr = (char*)strchr(ifr->ifr_name,':')) !=NULL) *cptr =0;
            
            if(strncmp(lastname, ifr->ifr_name,IFNAMSIZ) ==0)continue;
            
            memcpy(lastname, ifr->ifr_name,IFNAMSIZ);
            
            ifrcopy = *ifr;
            
            ioctl(sockfd,SIOCGIFFLAGS, &ifrcopy);
            
            if((ifrcopy.ifr_flags&IFF_UP) ==0)continue;
            
            NSString*ip = [NSString stringWithFormat:@"%s",inet_ntoa(((struct sockaddr_in*)&ifr->ifr_addr)->sin_addr)];
            
            [ips addObject:ip];
            
        }
        
    }
    
    close(sockfd);
    
    NSString*deviceIP =@"";
    
    for(int i=0; i < ips.count; i++)
        
    {
        
        if(ips.count>0)
            
        {
            
            deviceIP = [NSString stringWithFormat:@"%@",ips.lastObject];
            
        }
        
    }
    
    return deviceIP;
    
}