【发布时间】:2014-05-19 21:54:17
【问题描述】:
我有一个 iPad 应用程序,它使用 C 中的套接字库打开到 Intranet 中服务器的套接字连接。在启动应用程序时,如果 iPad 没有连接到同一网络(即无法解析服务器的域名),我希望它会自动建立 VPN 连接。但是应用程序中的套接字调用和 getaddrinfo() 方法不能做到这一点。他们只是无法连接到服务器而没有尝试打开 VPN 连接。
使用 Safari,浏览到地址“http://...”可以正常工作并成功启动 VPN。如果我在应用程序的开头使用下面的代码发出类似的 HTTP 请求,我可以让它启动 VPN 连接。但是发送一个额外的http请求对我来说是最好的解决方案。 VPN 应该在 iPad 需要解析域名时启动,而不依赖于协议或远程端口号。
NSString* urlForVPN = @"http://..";
NSURLRequest * urlRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:urlForVPN] cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:10.0];
[NSURLConnection sendSynchronousRequest:urlRequest returningResponse:&response error:&error];
在 Apple 开发者网站上,它说“避免在连接到主机之前解析 DNS 名称。连接到主机的首选方式是使用接受 DNS 名称的 API,例如 CFHost 或 CFNetService" (https://developer.apple.com/library/ios/documentation/NetworkingInternetWeb/Conceptual/NetworkingOverview/CommonPitfalls/CommonPitfalls.html)。因此,我希望以下代码在尝试解析服务器名称时应该启动 VPN,但它也不起作用。它只是无法获取IP地址。我必须手动打开 VPN 才能连接到服务器。
NSString* hostname = @"myserver";
CFHostRef hostRef = CFHostCreateWithName(kCFAllocatorDefault, (CFStringRef)hostname);
BOOL isSuccess = CFHostStartInfoResolution(hostRef, kCFHostAddresses, nil);
如何让应用了解它需要启动 VPN? “按需 VPN”是否仅适用于 URL 连接?
【问题讨论】:
标签: objective-c ios7 dns httprequest vpn