2

ほとんどの場合、私のアプリケーションは正常に動作しているようです。

ただし、中国で実行すると、サーバーの IP アドレスを取得できないことがあります。これを使用して、非同期に IP アドレスを取得します。

//...
CFStringRef hostAddress = CFStringCreateWithCString( kCFAllocatorDefault, hostAddressStr, kCFStringEncodingASCII );
CFHostRef theHostRef = CFHostCreateWithName( kCFAllocatorDefault, hostAddress   );
CFRelease(hostAddress);

CFHostClientContext context;
context.version = 0;
context.retain = nil;
context.release = nil;
context.copyDescription = nil;
context.info = self;
Boolean set_ok = CFHostSetClient( theHostRef, myCFHostClientCallBack, &context );
CFStreamError cfError;
CFHostScheduleWithRunLoop( theHostRef, CFRunLoopGetCurrent(), kCFRunLoopCommonModes);
Boolean is_resolving = CFHostStartInfoResolution( theHostRef, kCFHostAddresses, &cfError );
//...
void myCFHostClientCallBack( CFHostRef theHost, CFHostInfoType typeInfo, const CFStreamError *error, void* info) {
    int count = CFArrayGetCount(arrayRef);
    for( int index = 0; index < count; ++index ) {
         CFDataRef saData = (CFDataRef)CFArrayGetValueAtIndex(arrayRef, index);
         struct sockaddr_in*  remoteAddr = (struct sockaddr_in*)CFDataGetBytePtr(saData);
         if( remoteAddr != NULL)  {
            char* addressString = inet_ntoa(remoteAddr->sin_addr);
            if( addressString != NULL) {
                if( resolvedAddressString == NULL ) {
                   resolvedAddressString = addressString;
                }
            }
         }
     }
     // ...
}

iOS は、ローカルで利用可能な DNS を使用してドメイン名から IP アドレスへのルックアップを実行していると思われますが、その DNS が何らかの理由で失敗することがあると強く疑っています。

ISP 提供の DNS サーバーがサーバーの IP アドレスを返さない場合に備えて、Google などのパブリック DNS サーバーを使用して同様のクエリを作成する簡単な方法はありますか? このための API が見つからないので、可能であれば、これを達成するための簡単なサンプル コードへのリンクが欲しいです。

4

0 に答える 0