摘要: 無論是從 local dns 解析網域名稱,獲取到 ip 列表,還是從第三方的 dns 解析服務中,獲取到網域名稱對應的 ip 列表。我們獲得多個 ip 後,總是想選取乙個最優的 ip 使用,本文主要**如何在客戶端探測 ip 的連線性以及連線速度,保證返回可用性最好的ip,以達到「ip優選」的目的。
移動端 ip 優選方案
1. ip 優選目的
無論是從 local dns 解析網域名稱,獲取到 ip 列表,還是從第三方的 dns 解析服務中,獲取到網域名稱對應的 ip 列表。我們獲得多個 ip 後,總是想選取乙個最優的 ip 使用,本文主要**如何在客戶端探測 ip 的連線性以及連線速度,保證返回可用性最好的ip,以達到「ip優選」的目的。
我們以該 sdk 裡的測速邏輯為例進行原理解析。
3. ip 測試實現原理
使用 linux socket connect 和 select 函式實現的。 基於以下原理:
即使套介面是非阻塞的。如果連線的伺服器在同一臺主機上,那麼在呼叫connect 建立連線時,連線通常會立即建立成功,我們必須處理這種情況。
源自berkeley的實現(和posix.1g)有兩條與select 和非阻塞io相關的規則:
a. 當連線建立成功時,套介面描述符變成可寫;
b. 當連線出錯時,套介面描述符變成既可讀又可寫。
以 ios 實現為例:
- (int)testspeedof:(nsstring *)ip port:(int16_t)port
nsdate *starttime = [nsdate date];
nsdate *endtime;
//為了設定connect超時 把socket設定稱為非阻塞
int flags = fcntl(s, f_getfl,0);
fcntl(s,f_setfl, flags | o_nonblock);
//對於阻塞式套接字,呼叫connect函式將激發tcp的三次握手過程,而且僅在連線建立成功或者出錯時才返回;
//對於非阻塞式套接字,如果呼叫connect函式會之間返回-1(表示出錯),且錯誤為einprogress,表示連線建立,建立啟動但是尚未完成;
//如果返回0,則表示連線已經建立,這通常是在伺服器和客戶在同一臺主機上時發生。
// mark: - 使用select函式,對套接字的io操作設定超時。
/**select函式
select是一種io多路復用機制,它允許程序指示核心等待多個事件的任何乙個發生,並且在有乙個或者多個事件發生或者經歷一段指定的時間後才喚醒它。
connect本身並不具有設定超時功能,如果想對套接字的io操作設定超時,可使用select函式。
**/int maxfdp = s+1;
int j = select(maxfdp, null, &myset, null, &tv);
if (j == 0)
if (j < 0)
/**對於select和非阻塞connect,注意兩點:
[1] 當連線成功建立時,描述符變成可寫; [2] 當連線建立遇到錯誤時,描述符變為即可讀,也可寫,遇到這種情況,可呼叫getsockopt函式。
**/lon = sizeof(int);
//valopt 表示錯誤資訊。
// mark: - 測試核心邏輯,連線後,獲取錯誤資訊,如果沒有錯誤資訊就是訪問成功
/*!* //getsockopt函式可獲取影響套接字的選項,比如socket的出錯資訊
* (get socket option)
*/getsockopt(s, sol_socket, so_error, (void*)(&valopt), &lon);
//如果有錯誤資訊:
if (valopt) else
close(s);
return rtt;
}
移動端 IP 優選方案
摘要 無論是從 local dns 解析網域名稱,獲取到 ip 列表,還是從第三方的 dns 解析服務中,獲取到網域名稱對應的 ip 列表。我們獲得多個 ip 後,總是想選取乙個最優的 ip 使用,本文主要 如何在客戶端探測 ip 的連線性以及連線速度,保證返回可用性最好的ip,以達到 ip優選 的...
移動端 移動端頁面適配方案
這是mdn上的解釋 這個單位代表根元素的 font size 大小 例如 元素的font size 當用在根元素的font size上面時 它代表了它的初始值 也就是說,rem單位取值的大小和根元素html的font size取值直接相關。它跟html元素之間得關係為 html的fontsize值 ...
移動端適配方案
最簡單的移動端適配方案 rem vw 1vw等於螢幕寬度的1 1vh等於螢幕高度的1 通常設計稿為750寬度,螢幕總寬度為100vw 那麼 100vw 750px 1px 1px 100 750 1px就等於0.13333333vw 把單位放大100倍便於計算 html設計稿畫素單位轉換為rem單位...