2013-07-18 131 views
3

我需要從iOS應用的URL中獲取CDN的IP地址。從長遠堆棧的搜索,我已經確定了一種以這樣的以下內容:確定iOS中IP地址的IP地址

struct hostent *host_entry = gethostbyname("stackoverflow.com"); 
char *buff; 
buff = inet_ntoa(*((struct in_addr *)host_entry->h_addr_list[0])); 
// buff is now equal to the IP of the stackoverflow.com server 

但是,使用此代碼片段時,我的應用程序編譯失敗,並提出這樣的警告:「提領指向不完全類型「

我不知道結構,我不知道如何解決這個問題。有什麼建議麼?

我也試過:

#include <ifaddrs.h> 
#include <arpa/inet.h> 

但結果是相同的警告。

回答

5

我有沒有問題,編譯的代碼與以下包括:

#import <netdb.h> 
#include <arpa/inet.h> 
+0

D80,你太棒了!我想我錯過了一份重要聲明,並指出了我的正確方向。 – AddisDev

+0

NP - 祝你的工作順利完成。 – Dan

3

也許這個功能會起作用嗎?

#import <netdb.h> 
#include <arpa/inet.h> 

- (NSString*)lookupHostIPAddressForURL:(NSURL*)url 
{ 
    // Ask the unix subsytem to query the DNS 
    struct hostent *remoteHostEnt = gethostbyname([[url host] UTF8String]); 
    // Get address info from host entry 
    struct in_addr *remoteInAddr = (struct in_addr *) remoteHostEnt->h_addr_list[0]; 
    // Convert numeric addr to ASCII string 
    char *sRemoteInAddr = inet_ntoa(*remoteInAddr); 
    // hostIP 
    NSString* hostIP = [NSString stringWithUTF8String:sRemoteInAddr]; 
    return hostIP; 
} 
+0

感謝您的回答。不幸的是,這不能在編譯時警告「Dereferencing pointer to incomplete type」就行了:struct in_addr * remoteInAddr = ...這裏必須丟失一些東西。也許是進口? – AddisDev

+0

使用正確的導入語句,如上面選擇的答案所示,您的函數完美地工作。我希望我能夠選擇兩個正確的答案。 – AddisDev

+0

這是一個恥辱!我將添加正確的陳述作爲參考。 – ApolloSoftware

1

這裏是一個雨燕3.1版本的URL主機名轉換爲IP地址。

import Foundation 
private func urlToIP(_ url:URL) -> String? { 
    guard let hostname = url.host else { 
    return nil 
    } 

    guard let host = hostname.withCString({gethostbyname($0)}) else { 
    return nil 
    } 

    guard host.pointee.h_length > 0 else { 
    return nil 
    } 

    var addr = in_addr() 
    memcpy(&addr.s_addr, host.pointee.h_addr_list[0], Int(host.pointee.h_length)) 

    guard let remoteIPAsC = inet_ntoa(addr) else { 
    return nil 
    } 

    return String.init(cString: remoteIPAsC) 
}