¿Cómo puedo get la dirección IP exacta que solía conectarse en iOS?

Creé una request con un nombre de dominio, por ejemplo, http://www.google.com . Pero, ¿cómo podría get exactamente la dirección IP que utilizaba el marco para conectarse al server?

Sabía que el método gethostbyname o el método nslookup podrían darnos la dirección, pero como la dirección IP está asignada dinámicamente, tal vez la dirección IP que solicito ese momento sea diferente con estos methods devueltos.

Entonces, ¿hay alguna forma de get la dirección IP real solicitada? (Quería get el ip mediante progtwigción, en lugar de usar tcpdump, etc.)

Cuando dices "cual es el marco utilizado" aquí, supongo que te refieres a NSURLSession , NSURLConnection , UIWebView o WKWebView . Cada uno de ellos es una situación ligeramente diferente, pero en todos ellos, la respuesta es que no es posible directamente (pero ver a continuación, es posible indirectamente). No tiene acceso a los zócalos subyacentes que cualquiera de ellos usa. Todos usan agrupación de conexiones, lo que complica las cosas un poco, incluso si se puede get "el socket". Y en el caso de UIWebView y WKWebView , una única request a www.google.com puede generar varias conexiones independientes, cada una de las cuales potencialmente podría interactuar con una dirección IP diferente.

(Estoy un poco fascinado por lo que intentas hacer. Debido al equilibrio de carga, una sola dirección IP no significa un solo server, por lo que las direcciones IP son solo marginalmente más identificables que las CNAME. Mezclando proxies inverso … …)

Si necesita este tipo de acceso, debe administrar el socket usted mismo. Eso es generalmente posible con todos los sistemas excepto WKWebView . Asumiré que ya sabe (o puede estudiar fácilmente) cómo crear un socket y realizar HTTP usando CFSocket y CFHTTPMessage . Esto está ampliamente cubierto en la Guía de progtwigción de CFNetwork . Si ha creado el socket, puede usar CFSocketCopyPeerAddress para verificar en qué host está realmente conectado. Esa es la pieza que querías.

Dado que puedes crear este tipo de socket y administrarlo tú mismo, puedes conectarlo a los principales cargadores de URL (excepto WKWebView ) utilizando un NSURLProtocol . Consulte Drop-in Caching sin connection para UIWebView (y NSURLProtocol) para una introducción rápida y algunos ejemplos de código. Solo necesita tomar la request y hacerlo usted mismo con CFSocket , dándole la oportunidad de ver el puerto exacto al que está conectado.

Su browser o cualquier otra herramienta que use para hacer una request HTTP searchá la dirección en el momento de realizar la request. En cualquier sistema razonable, usarán el mismo método para search la dirección como gethostbyname , excepto que puede haber caching local en el browser (que normalmente puede desactivar o borrar).

La request podría get una respuesta de networkingirección para hacer la misma request a una location diferente. Estos se utilizan a menudo para equilibrar la carga, etc. La única forma directa en que puedo ver que podría descubrir el "destino final" detrás de estos, sería hacer la request mediante progtwigción y registrar los detalles de cualquier networkingirección, por supuesto , es la naturaleza del equilibrio de carga que puede networkingirigir a un server ligeramente diferente cada vez.

Esto no tiene nada que ver con la 'asignación dinámica de direcciones IP' por cierto. Si la dirección IP de www.google.com cambia, es probable que no sea porque el mismo server ha recibido una dirección IP diferente, sino porque las requestes se dirigen a una máquina diferente.