2015-07-20 20 views
5

Bir etki alanı adı kullanarak bir istek oluşturdum, ör. http://www.google.com. Ancak, çerçevenin sunucuya bağlanmak için kullandığı ip adresini tam olarak nasıl alabilirim?iOS'ta bağlanmak için kullanılan tam IP adresini nasıl edinebilirim?

gethostbyname yönteminin ya da nslookup yönteminin bize adresi verebileceğini biliyordum, ancak ip adresi dinamik olarak ayrıldığından, bu yöntemin döndürdüğü ip adresi bu yöntemlerle farklı olabilir.

Gerçek istenen IP adresini almamın bir yolu var mı? (Tcpdump kullanmak yerine, programlı olarak ipi almak istedim.)

+0

http: // stackoverflow.com/questions/6807788/nasıl yapılır-ip-adresi-iphone-programatik –

+0

@SaurabhPrajapati Bu yazıyı okudum, ama istediğim şey değil, lütfen açıklamama bakın. Yine de teşekkürler. – feihu

cevap

1

, sana NSURLSession, NSURLConnection, UIWebView veya WKWebView demek varsayalım. Bunların her biri biraz farklı bir durumdur, ama hepsinde, cevap doğrudan mümkün değildir (ancak aşağıya bakınız; dolaylı olarak mümkündür). Herhangi birinin kullandığı temel yuvalara erişiminiz yoktur. Hepsi "soket" elde edebilecek olsanız bile bazı şeyleri hafifleten bağlantı havuzu kullanır. Ve UIWebView ve WKWebView durumlarında, www.google.com için tek bir istek, her biri potansiyel olarak farklı bir IP adresiyle etkileşim kurabilen birkaç bağımsız bağlantı oluşturabilir.

(Yapmaya çalıştığınız şeyden biraz etkilendim. Yük dengelemesinden dolayı, tek bir IP adresi tek bir sunucu anlamına gelmez, dolayısıyla IP adresleri CNAME'den çok daha az belirleyicidir. ters proxy'ler ....)

Eğer bu tür bir erişime ihtiyacınız varsa, soketi kendiniz yönetmek zorundasınız. Bu genellikle WKWebView hariç tüm sistemlerde mümkündür. Bir soket oluşturmayı ve CFSocket ve CFHTTPMessage'u kullanarak HTTP'yi nasıl gerçekleştireceğinizi (veya kolayca okuyabileceğinizi) bildiğinizi varsayacağım. Bu, kapsamlı olarak CFNetwork Programming Guide'da kaplıdır. Soketi oluşturduysanız, hangi ana bilgisayara bağlı olduğunuzu kontrol etmek için CFSocketCopyPeerAddress'u kullanabilirsiniz. İstediğiniz parça bu.

Bu tür bir yuva oluşturabildiğiniz ve bunu kendi başınıza yönetebildiğiniz için, bunu bir NSURLProtocol kullanarak büyük URL yükleyicilerine (WKWebView hariç) bağlayabilirsiniz. Hızlı bir giriş ve bazı örnek kod için bkz. Drop-in Offline Caching for UIWebView (and NSURLProtocol). İsteğinizi almanız ve bağlandığınız bağlantı noktasını görebilmeniz için CFSocket ile kendiniz yapmanız gerekir.

+0

Detaylı cevap için çok teşekkürler. Evet, varsaydığın şey sorumu doğrudur. Söylediğin gibi, korkarım ki bunu başarmanın tek yolu "soketi yönetmek" olabilir. Denemek isterdim. Teşekkürler. – feihu

1

Tarayıcınız veya bir HTTP isteğini yapmak için kullandığınız başka herhangi bir araç, istekte bulunduğunda adresi arar. Herhangi bir makul sistemde, tarayıcıda yerel önbellekleme olabileceği (genellikle kapatabileceğiniz veya temizleyebileceğiniz) haricinde, adrese gethostbyname olarak bakmak için aynı yöntemi kullanırlar.

İstek, aynı isteği farklı bir konuma yapmak için bir yönlendirme yanıtı alabilir. Bunlar genellikle yük dengeleme, vb. Için kullanılır. Bunların ardındaki nihai hedefleri bulabileceğinizi görebilmemin en basit yolu, istekleri programatik olarak yapmak ve herhangi bir yeniden yönlendirmenin ayrıntılarını kaydetmek olacaktır. Her seferinde biraz farklı bir sunucuya yönlendirebileceğiniz yük dengelemenin doğasıdır. Bu, bu arada 'IP adreslerinin dinamik olarak atanması' ile ilgisi yoktur. www.google.com IP adresi değişirse, aynı sunucunun farklı bir IP adresi tahsis ettiği, ancak isteklerin farklı bir makineye yönlendirildiği için olması muhtemel değildir. Burada "çerçeve kullanılan hangi" derken

+0

Teşekkürler, siz ve Rob'un önerdiği gibi, hedefe ulaşmak için isteği kendim yönetmek zorundayım. Denemeliyim. – feihu

İlgili konular