如何获得iOS中用于连接的ip地址?

如何获得iOS中用于连接的ip地址?,ios,http,networking,afnetworking,cfnetwork,Ios,Http,Networking,Afnetworking,Cfnetwork,我使用域名创建了一个请求,例如,http://www.google.com。但是,我如何获得框架用于连接到服务器的确切ip地址呢 我知道gethostbyname方法或nslookup方法可以为我们提供地址,但由于ip地址是动态分配的,所以我请求的ip地址可能与这些方法返回的ip地址不同 那么,有没有办法让我获得真正请求的ip地址?(我希望以编程方式获取ip,而不是使用tcpdump等。)您的浏览器或用于发出HTTP请求的任何其他工具将在请求时查找地址。在任何合理的系统上,他们将使用与getho

我使用域名创建了一个请求,例如,
http://www.google.com
。但是,我如何获得框架用于连接到服务器的确切ip地址呢

我知道
gethostbyname
方法或
nslookup
方法可以为我们提供地址,但由于ip地址是动态分配的,所以我请求的ip地址可能与这些方法返回的ip地址不同


那么,有没有办法让我获得真正请求的ip地址?(我希望以编程方式获取ip,而不是使用tcpdump等。)

您的浏览器或用于发出HTTP请求的任何其他工具将在请求时查找地址。在任何合理的系统上,他们将使用与
gethostbyname
相同的方法查找地址,只是浏览器中可能存在本地缓存(通常可以关闭或清除)

该请求可能会得到重定向响应,以便将相同的请求发送到不同的位置。这些通常用于负载平衡等。我能看到的唯一简单的方法是,您能够找到这些背后的“最终目的地”,即以编程方式发出请求,并记录任何重定向的详细信息,当然,负载平衡的本质是,您每次都可能重定向到稍微不同的服务器

顺便说一下,这与“动态分配IP地址”无关。如果
www.google.com
的IP地址发生变化,很可能不是因为同一台服务器被分配了不同的IP地址,而是因为请求被定向到了不同的机器。

当你在这里说“框架使用了哪个”,我想你的意思是
NSURLSession
NSURLConnection
UIWebView
,或
WKWebView
。每一种情况都略有不同,但在所有这些情况下,答案都是不可能直接实现(但见下文;可能是间接实现的)。您无法访问其中任何一个使用的底层套接字。它们都使用连接池,这会使事情稍微复杂化,即使你可以得到“套接字”。在
UIWebView
WKWebView
的情况下,对
www.google.com
的单个请求可能会生成几个独立的连接,每个连接都可能与不同的IP地址交互

(我有点着迷于您正在尝试做的事情。由于负载平衡,单个IP地址并不意味着单个服务器,因此IP地址只比CNAMEs稍微更具识别性。混合使用反向代理…)

如果您需要这种访问,您必须自己管理套接字。除了
WKWebView
之外,所有系统都可以这样做。我假设您已经知道(或者可以轻松地学习)如何创建套接字并使用
CFSocket
CFHTTPMessage
执行HTTP。这在本手册中有广泛的介绍。如果已创建套接字,则可以使用
CFSocketCopyPeerAddress
检查您真正连接到的主机。那正是你想要的


如果您能够创建此类套接字并自行管理,则可以使用
NSURLProtocol
将其挂接到主要的URL加载程序(除了
WKWebView
)中。有关快速介绍和一些示例代码,请参见。您只需接受请求并使用
CFSocket
自行创建,就可以查看您连接的确切端口。

如果您使用
NSURLSession
获取
URLSessionStreamTask
,您可以使用
-captureStreams
捕获底层流。这将调用
-URLSession:streamTask:didBecomeInputStream:outputStream:
委托方法,为您提供
NSInputStream
NSOutputStream
NSInputStream
免费桥接到
CFReadStreamRef
并使用
CFReadStreamCopyProperty()
和常量
kCFStreamPropertySocketNativeHandle
提供本机套接字句柄,您可以将其传递到
getpeername()
。对于上传、下载和数据任务,似乎不存在这种可能性。

@SaurabhPrajapati我读过这篇文章,但这不是我想要的,请参考我的描述。无论如何,谢谢。这回答了你的问题吗?非常感谢你的详细回答。是的,关于我的问题,你的假设是正确的。就像你说的,我担心实现这一点的唯一方法可能是自己“管理套接字”。我想试试。谢谢。谢谢,就像你和罗布建议的那样,我必须自己处理请求才能到达目的地。我想试试。