すべてのプロダクト
Search
ドキュメントセンター

HTTPDNS:C 用 HTTPDNS SDK の組み込み

最終更新日:Nov 26, 2025

このセクションでは、HTTPDNS C SDK を統合する方法について説明します。

ステップ 1: 環境の準備

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 に含まれていません。これらのライブラリがインストールされ、それらのヘッダーファイルとライブラリファイルのディレクトリがプロジェクトに追加されていることを確認してください。これらの C/C++ ライブラリをインストールするには、VCPKG インストールと手動インストールの 2 つの方法があります。

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 手動インストール

説明

UNIX 系プラットフォームのパッケージマネージャを使用して cJSON パッケージを自動的にインストールできない場合は、次のコマンドを実行してインストールします。

git clone https://github.com/DaveGamble/cJSON.git && cd cJSON && mkdir build && cd build && cmake ../ && sudo make install && cd ../../ && rm -rf cJSON

ステップ 2: SDK のインストール

  • Linux/macOS

    git clone https://github.com/aliyun/alibabacloud-httpdns-c-sdk.git
    cd alibabacloud-httpdns-c-sdk
    mkdir build
    cd build
    # 依存関係ライブラリが VCPKG を使用してインストールされている場合は、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 のインストールパス}

ステップ 3: 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 クライアントを使用する
説明
  • HTTPDNS_ACCOUNT は、HTTPDNS によって提供されるアカウント ID です。詳細については、「参照ドキュメント」をご参照ください。

  • HTTPDNS_SECRET は、リクエスト署名のキーです。認証が不要な場合は NULL に設定します。解決に認証が必要な場合は、キーを指定します。詳細については、「参照ドキュメント」をご参照ください。

3.4 クライアントの構成

クライアントインスタンスを作成した後、次のように HTTPDNS クライアントをカスタマイズします。

// サーバーへのリクエストのタイムアウトをミリ秒単位で設定します
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);
// ローカル DNS への自動フォールバックを有効にします
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 を使用してドメイン名解決を実行します。このセクションでは、単一ドメイン同期 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 の選択

ドメイン名の名前解決結果を取得した後、ドメイン名が解決された 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);
        /* 常にクリーンアップする */
        curl_easy_cleanup(curl);
    }
}

3.9 クライアントのクリーンアップ

クライアントが不要になったら解放します。

hdns_client_cleanup(client);

3.10 SDK のクリーンアップ

SDK が不要になったら解放します。

hdns_sdk_cleanup();