本章節介紹了HTTPDNS C SDK的接入方法。
第一步:環境準備
SDK的整合依賴於必要的構建工具和第三方庫,在整合SDK前請在構建機器上安裝這些依賴。
名稱 | 描述 | 版本 |
git | 版本控制工具 | 1.8及以上 |
cmake | 構建工具 | 3.0及以上 |
gcc | 編譯工具 | 4.5及以上 |
vcpkg(可選) | 依賴庫管理工具 | 推薦最新版本 |
libcurl | 應用程式層協議庫 | 7.33.0及以上 |
apr/apr-util | C\C++跨平台組件庫 | 1.5.2及以上 |
cjson | JSON字串解析 | 推薦最新版本 |
1. 構建工具安裝
構建過程中需要使用git複製代碼、使用cmake構建工程、使用gcc/g++編譯代碼,請您確認這些命令列工具已經安裝在本機,如果尚未安裝,請參考以下命令安裝:
Ubuntu/Debian
sudo apt update sudo apt install -y git cmake gcc g++Aliyun/CentOS Stream/Fedora
sudo yum check-update sudo yum install -y git cmake gcc gcc-c++OpenSUSE
sudo zypper refresh sudo zypper install -y git cmake gcc gcc-c++macOS
export HOMEBREW_NO_AUTO_UPDATE=1 brew install git gcc cmake說明注意:brew非macOS內建的包管理器,安裝包之前請先安裝brew。
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"Windows
下載安裝Visual Studio (工作負載選擇“使用C++的案頭開發”)
2. 依賴庫安裝
SDK使用libcurl庫(版本7.33.0及以上)進行網路操作,使用apr/apr-util(版本1.5.2及以上)庫解決記憶體管理以及跨平台問題,使用cjson庫解析服務端響應報文,SDK並沒有帶上這幾個外部庫,您需要確認這些庫已經安裝,並且將它們的標頭檔目錄和庫檔案目錄都加入到了專案中。本專案支援VCPKG安裝和手動安裝兩種方式安裝這些C/C++庫。
2.1 VCPKG安裝
安裝SDK依賴的庫
macOS/Linux
./vcpkg install apr apr-util curl[openssl,http2] cjsonWindows
.\vcpkg.exe install apr apr-util curl[openssl,http2] cjson說明VCPKG 預設安裝與當前平台相對應的庫。如果需要進行跨平台編譯,例如在 Windows x64 環境下編譯 x86 庫,則需指定 triplet。樣本命令如下:
./vcpkg.exe install apr:x86-windows apr-util:x86-windows curl[openssl,http2]:x86-windows cjson:x86-windows
2.2 手動安裝
Ubuntu/Debian
sudo apt update sudo apt install -y libcurl4-openssl-dev libapr1-dev libaprutil1-dev libcjson-devAliyun/CentOS Stream/Fedora
sudo yum check-update sudo yum install -y libcurl-devel apr-devel apr-util-devel cjson-develOpenSUSE
sudo zypper refresh sudo zypper install -y libcurl-devel libapr1-devel libapr-util1-devel cJSON-develmacOS
brew install curl apr apr-util cjsonWindows
注意:如果cJSON開發包不能通過Unix-like平台包管理器自動安裝,可以通過以下命令手動安裝:
git clone https://github.com/DaveGamble/cJSON.git && cd cJSON && mkdir build && cd build && cmake ../ && sudo make install && cd ../../ && rm -rf cJSON第二步:SDK安裝
Linux/macOS
git clone https://github.com/aliyun/alibabacloud-httpdns-c-sdk.git cd alibabacloud-httpdns-c-sdk mkdir build cd build # 如果是通過VCPKG安裝的依賴庫,則構建SDK時需要添加Cmake參數 -DVCPKG_ROOT=${vcpkg的安裝路徑} cmake -DCMAKE_BUILD_TYPE=Release ../ make hdns_unite_test sudo make install sudo ldconfigWindows
下載工程
Visual Studio開啟Cmake工程
管理配置中配置Cmake命令參數:-DVCPKG_ROOT=${vcpkg的安裝路徑}
第三步:SDK整合
SDK的整合可以參考C 整合樣本,下面介紹具體整合步驟。
3.1 引入SDK
整合SDK需要引入安裝在本地的庫和標頭檔,以cmake工程為例,在工程CMakeLists.txt檔案中加入以下命令:
find_library(HTTPDNS_LIBRARY httpdns_c_sdk_static)
include_directories(${CMAKE_INSTALL_PREFIX}/include/httpdns)3.2 SDK初始化
SDK運行環境初始化。
if (hdns_sdk_init() != HDNS_OK) {
hdns_sdk_cleanup();
}
// 使用SDK API
3.3 用戶端建立
hdns_client_t *client = hdns_client_create(HTTPDNS_ACCOUNT, HTTPDNS_SECRET);
if (client == NULL) {
hdns_sdk_cleanup();
}
// 使用HTTPDNS Client3.4 用戶端配置
用戶端執行個體建立成功之後,如果使用者希望對HTTPDNS 用戶端進行自訂配置可以通過以下方式進行:
// 佈建要求服務端逾時時間,單位:ms
hdns_client_set_timeout(client, 2000);
// 是否開啟本機快取
hdns_client_set_using_cache(client, true);
// 是否使用https協議訪問HTTPDNS服務端
hdns_client_set_using_https(client, true);
// 請求是否進行加簽
hdns_client_set_using_sign(client, true);
// 請求服務端重試次數
hdns_client_set_retry_times(client, 1);
// 設定HTTPDNS解析服務叢集
hdns_client_set_region(client, "global");
// 設定HTTPDNS調度叢集
hdns_client_set_schedule_center_region(client, "cn");
// 設定網路變化後是否更新本機快取
hdns_client_enable_update_cache_after_net_change(client, true);
// 是否允許擷取到期緩衝
hdns_client_enable_expired_ip(client, true);
// 是否自動降級到localdns
hdns_client_enable_failover_localdns(client, true);
// 添加預解析網域名稱
hdns_client_add_pre_resolve_host(client, "www.aliyun.com");
// 添加Ip嗅探
hdns_client_add_ip_probe_item(client, "www.aliyun.com", 443);
// 自訂ttl
hdns_client_add_custom_ttl_item(client, "www.aliyun.com", 120);
hdns_client_set_using_https參數設定為true後,計費會增加,請仔細閱讀產品計費文檔。
3.5 用戶端啟動
hdns_client_start(client);3.6 網域名稱解析
用戶端執行個體啟動之後,就可以調用SDK提供的API進行網域名稱解析了,SDK針對不同的情境提供了多個API介面,這裡以單網域名稱同步介面為例,展示調用API擷取HTTPDNS解析結果的使用過程。
hdns_list_head_t *results = NULL;
hdns_status_t status = hdns_get_result_for_host_sync_with_cache(client,
MOCK_BUSINESS_HOST,
HDNS_QUERY_AUTO,
NULL, &results);3.7 IP選擇
通過SDK API擷取網域名稱的解析結果之後,就可以通過解析的IP訪問客戶的業務了。
if (hdns_status_is_ok(&status)) {
char ip[HDNS_IP_ADDRESS_STRING_LENGTH];
if (hdns_select_ip_randomly(results, HDNS_QUERY_AUTO, ip) == HDNS_OK) {
mock_access_business_web_server(ip);
}
}
if (hdns_status_is_ok(&status)) {
char ip[HDNS_IP_ADDRESS_STRING_LENGTH];
if (hdns_select_ip_randomly(results, HDNS_QUERY_AUTO, ip) == HDNS_OK) {
mock_access_business_web_server(ip);
}
}
hdns_list_free(results);3.8 業務訪問
static void mock_access_business_web_server(const char *dst_ip) {
CURL *curl;
CURLcode res;
curl = curl_easy_init();
if (curl) {
// 拼接業務URL
char url[256];
strcpy(url, "https://");
strcat(url, MOCK_BUSINESS_HOST);
curl_easy_setopt(curl, CURLOPT_URL, url);
curl_easy_setopt(curl, CURLOPT_TIMEOUT, 30);
// HTTPS設定預解析的主機和 IP
struct curl_slist *dns;
char sni[256];
strcpy(sni, MOCK_BUSINESS_HOST);
strcat(sni, ":443:");
strcat(sni, dst_ip);
dns = curl_slist_append(NULL, sni);
curl_easy_setopt(curl, CURLOPT_RESOLVE, dns);
// 設定響應結果回調
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data_callback);
#if defined(_WIN32)
curl_easy_setopt(curl, CURLOPT_SSL_OPTIONS, CURLSSLOPT_NATIVE_CA);
#endif
// 發起HTTP請求
res = curl_easy_perform(curl);
if (res != CURLE_OK) {
fprintf(stderr, "curl_easy_perform() failed, url=%s, ip=%s, error=%s\n",
url,
dst_ip,
curl_easy_strerror(res));
}
// 釋放業務訪問相關資源
curl_slist_free_all(dns);
/* always cleanup */
curl_easy_cleanup(curl);
}
}
3.9 用戶端清理
client不再使用後,需要將其釋放。
hdns_client_cleanup(client);3.10 SDK清理
SDK不再使用後,需要將其釋放。
hdns_sdk_cleanup();