2015-07-20 14 views
5

Tôi đã tạo một yêu cầu sử dụng tên miền, ví dụ: http://www.google.com. Nhưng làm thế nào tôi có thể nhận được địa chỉ IP chính xác mà khuôn khổ được sử dụng để kết nối với máy chủ?Làm cách nào để có được địa chỉ IP chính xác được sử dụng để kết nối trong iOS?

Tôi biết rằng phương pháp gethostbyname hoặc phương pháp nslookup có thể cung cấp cho chúng tôi địa chỉ, nhưng vì địa chỉ ip được phân bổ động, có thể địa chỉ ip tôi yêu cầu thời gian khác với các phương thức này được trả lại.

Vì vậy, có cách nào để tôi nhận được địa chỉ ip được yêu cầu thực không? (Tôi muốn lấy ip theo lập trình, thay vì sử dụng tcpdump, v.v.)

+0

http: // stackoverflow.com/questions/6807788/how-to-get-ip-address-of-iphone-programatically –

+0

@SaurabhPrajapati tôi đã đọc bài đăng này, nhưng nó không phải là những gì tôi muốn, xin vui lòng tham khảo mô tả của tôi. Dù sao cũng cảm ơn bạn. – feihu

Trả lời

1

Khi bạn nói "khung được sử dụng" ở đây, tôi giả sử bạn có nghĩa là NSURLSession, NSURLConnection, UIWebView hoặc WKWebView. Mỗi trong số đó là một tình huống hơi khác, nhưng trong tất cả chúng, câu trả lời là không thể trực tiếp (nhưng xem bên dưới; nó có thể gián tiếp). Bạn không có quyền truy cập vào các ổ cắm cơ bản mà bất kỳ người trong số họ sử dụng. Tất cả chúng đều sử dụng kết nối tổng hợp, điều này làm phức tạp đôi chút ngay cả khi bạn có thể lấy "ổ cắm". Và trong trường hợp của UIWebViewWKWebView, một yêu cầu duy nhất đến www.google.com có thể tạo ra một số kết nối độc lập, mỗi kết nối có thể tương tác với một địa chỉ IP khác.

(Tôi rất thích thú với những gì bạn đang cố gắng làm. Do cân bằng tải, một địa chỉ IP không có nghĩa là một máy chủ đơn lẻ, vì vậy địa chỉ IP chỉ nhận dạng nhỏ hơn CNAME. reverse proxies ....)

Nếu bạn cần loại quyền truy cập này, bạn phải tự quản lý socket. Điều này thường có thể xảy ra với tất cả các hệ thống ngoại trừ WKWebView. Tôi giả sử rằng bạn đã biết (hoặc có thể dễ dàng nghiên cứu) cách tạo ổ cắm và thực hiện HTTP bằng cách sử dụng CFSocketCFHTTPMessage. Điều này được bao phủ rộng rãi trong CFNetwork Programming Guide. Nếu bạn đã tạo ổ cắm, bạn có thể sử dụng CFSocketCopyPeerAddress để kiểm tra xem bạn thực sự kết nối với máy chủ nào. Đó là mảnh bạn muốn.

Do bạn có thể tạo loại ổ cắm này và tự quản lý nó, bạn có thể móc nó vào trình tải URL chính (trừ WKWebView) sử dụng NSURLProtocol. Xem Drop-in Offline Caching for UIWebView (and NSURLProtocol) để biết giới thiệu nhanh và một số mã mẫu. Bạn chỉ cần thực hiện yêu cầu và tự mình thực hiện yêu cầu với CFSocket, mang lại cho bạn cơ hội để xem chính xác cổng bạn đã kết nối.

+0

Cảm ơn rất nhiều vì câu trả lời chi tiết. Có những gì bạn giả định là chính xác về câu hỏi của tôi. Giống như những gì bạn nói, tôi sợ rằng cách duy nhất để đạt được điều này có thể là "tự quản lý socket". Tôi sẽ có một thử. Cảm ơn. – feihu

1

Trình duyệt của bạn hoặc bất kỳ công cụ nào khác bạn sử dụng để thực hiện yêu cầu HTTP sẽ tra cứu địa chỉ tại thời điểm yêu cầu. Trên bất kỳ hệ thống hợp lý nào, họ sẽ sử dụng cùng một phương pháp để tra cứu địa chỉ là gethostbyname, ngoại trừ việc có thể có bộ nhớ đệm cục bộ trong trình duyệt (bạn thường có thể tắt hoặc xóa).

Yêu cầu có thể nhận được phản hồi chuyển hướng để đưa ra yêu cầu tương tự cho một vị trí khác. Chúng thường được sử dụng để cân bằng tải, vv Cách đơn giản nhất tôi có thể thấy rằng bạn sẽ có thể tìm ra 'đích đến cuối cùng' đằng sau chúng, sẽ làm cho yêu cầu lập trình và ghi lại chi tiết của bất kỳ chuyển hướng nào, Tất nhiên , đó là bản chất của cân bằng tải mà bạn có thể chuyển hướng đến một máy chủ hơi khác nhau mỗi lần.

Điều này không liên quan gì đến 'phân bổ động địa chỉ IP'. Nếu địa chỉ IP của www.google.com thay đổi, có thể không phải vì cùng một máy chủ đã được cấp một địa chỉ IP khác, nhưng vì các yêu cầu đang được chuyển hướng đến một máy khác.

+0

Cảm ơn, giống như những gì bạn và Rob đề nghị, tôi sẽ phải tự mình quản lý yêu cầu để có được điểm đến. Tôi sẽ cho nó thử. – feihu

Các vấn đề liên quan