6

iOS アプリの URL から CDN の 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>

しかし、結果は同じ警告です。

4

3 に答える 3

6

これは、URL ホスト名を IP アドレスに変換する Swift 3.1 バージョンです。

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)
}
于 2017-04-18T21:39:52.327 に答える
5

次のインクルードを使用してそのコードをコンパイルしても問題はありませんでした。

#import <netdb.h>
#include <arpa/inet.h>
于 2013-07-18T17:00:31.887 に答える
5

多分この機能は動作しますか?

#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;
}
于 2013-07-18T15:04:10.527 に答える