我使用域名创建了一个请求,例如http://www.google.com
。但是我怎样才能获得框架用于连接服务器的确切IP地址呢?
我知道gethostbyname
方法或nslookup
方法可以给我们地址,但是由于ip地址是动态分配的,可能我当时请求的ip地址与这些方法返回的不同。
那么有没有办法让我获得真实请求的ip地址呢? (我想以编程方式获取ip,而不是使用tcpdump等)
当你在这里说“框架使用了哪个”时,我假设你的意思是NSURLSession
, NSURLConnection
, UIWebView
, or WKWebView
。每一种情况都略有不同,但在所有情况下,答案都是不可能直接实现(但见下文;间接可能)。您无权访问它们中任何一个使用的底层套接字。它们都使用连接池,即使您可以获得“套接字”,这也会使事情稍微复杂化。而在这种情况下UIWebView
and WKWebView
,单个请求www.google.com
可能会生成多个独立的连接,每个连接都可能与不同的 IP 地址进行交互。
(我对你想要做的事情有点着迷。由于负载平衡,单个 IP 地址并不意味着单个服务器,因此 IP 地址仅比 CNAME 更具识别性。混合反向代理.. ..)
如果您需要这种访问,您必须自己管理套接字。这对于所有系统来说通常都是可能的,除了WKWebView
。我假设您已经知道(或者可以轻松学习)如何创建套接字并使用以下命令执行 HTTPCFSocket
and CFHTTPMessage
。这在CFNetwork编程指南 https://developer.apple.com/library/ios/documentation/Networking/Conceptual/CFNetwork/Introduction/Introduction.html。如果您已经创建了套接字,则可以使用CFSocketCopyPeerAddress
检查您真正连接到的主机。这就是你想要的那件作品。
鉴于您能够创建这种类型的套接字并自己管理它,您可以将其挂接到主要的 URL 加载器中(除了WKWebView
)使用NSURLProtocol
. See UIWebView(和 NSURLProtocol)的直接离线缓存 http://robnapier.net/offline-uiwebview-nsurlprotocol快速介绍和一些示例代码。您只需要接受请求并自己制作CFSocket
,让您有机会查看您所连接的确切端口。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)