このセクションでは、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
Visual Studio のダウンロードとインストール。ワークロードには、[C++ によるデスクトップ開発] を選択します。
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] 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
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 ldconfigWindows
プロジェクトをダウンロードします。
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 クライアントを使用する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();