全部產品
Search
文件中心

HTTPDNS:C SDK接入

更新時間:Nov 26, 2025

本章節介紹了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

2. 依賴庫安裝

SDK使用libcurl庫(版本7.33.0及以上)進行網路操作,使用apr/apr-util(版本1.5.2及以上)庫解決記憶體管理以及跨平台問題,使用cjson庫解析服務端響應報文,SDK並沒有帶上這幾個外部庫,您需要確認這些庫已經安裝,並且將它們的標頭檔目錄和庫檔案目錄都加入到了專案中。本專案支援VCPKG安裝和手動安裝兩種方式安裝這些C/C++庫。

2.1 VCPKG安裝

  • 安裝VCPKG

  • 安裝SDK依賴的庫

    • macOS/Linux

       ./vcpkg install apr apr-util curl[openssl,http2] cjson
    • Windows

      .\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-dev
  • Aliyun/CentOS Stream/Fedora

    sudo yum check-update
    sudo yum install -y libcurl-devel apr-devel apr-util-devel cjson-devel
  • OpenSUSE

    sudo zypper refresh
    sudo zypper install -y libcurl-devel libapr1-devel libapr-util1-devel cJSON-devel
  • macOS

    brew install curl apr apr-util cjson
  • Windows

說明

注意:如果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 ldconfig
  • Windows

    • 下載工程

    • 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 Client
說明
  • HTTPDNS_ACCOUNT是HTTPDNS為賬戶分配的Account ID,擷取方式參考產品使用流程

  • HTTPDNS_SECRET是請求加簽時的密鑰,如果不需要鑒權,則設定為NULL,如果解析需要鑒權,則需要填入,參考文檔開發配置

3.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();