HTTPDNS C SDK をプロジェクトに統合し、HTTPDNS サービスを使用してドメイン名を解決します。
ステップ 1:環境の準備
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++ を使用します。これらの CLI ツールがローカルマシンにインストールされていることを確認してください。インストールされていない場合は、次のコマンドを実行してインストールします:
-
Ubuntu/Debian
sudo apt update sudo apt install -y git cmake gcc g++ -
Alibaba Cloud Linux/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説明Homebrew は macOS の組み込みパッケージマネージャーではありません。パッケージをインストールする前に、Homebrew をインストールしてください。
/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 を使用するか、手動でインストールできます。
2.1 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 ライブラリをコンパイルするなど) を行うには、トリプレットを指定する必要があります。例:
./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 -
Alibaba Cloud Linux/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
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 を使用してインストールした場合は、SDK のビルド時に CMake パラメーター -DVCPKG_ROOT=${path_to_vcpkg} を追加します。 cmake -DCMAKE_BUILD_TYPE=Release ../ make hdns_unit_test sudo make install sudo ldconfig -
Windows
-
プロジェクトをダウンロードします。
-
Visual Studio で CMake プロジェクトを開きます。
-
構成マネージャーで、CMake コマンドパラメーターを -DVCPKG_ROOT=${path_to_vcpkg} に設定します
-
ステップ 3:SDK の統合
詳細については、「C 統合の例」をご参照ください。統合手順は以下のとおりです。
3.1 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 です。アカウント 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);
// Time-to-Live (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 を呼び出してドメイン名を解決します。次の例では、単一のドメイン名の同期解決を実行します:
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);
}
}
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();