Topik ini menjelaskan cara mengintegrasikan HTTPDNS SDK untuk C.
Langkah 1: Persiapkan lingkungan
Integrasi SDK memerlukan alat pembuatan dan pustaka pihak ketiga. Sebelum memulai, pastikan dependensi terinstal di mesin Anda.
Name | Deskripsi | Versi |
git | Alat pengelolaan versi | 1.8 dan yang lebih baru. |
cmake | Alat pembuatan | 3.0 dan yang lebih baru. |
gcc | Alat kompilasi | 4.5 dan yang lebih baru. |
vcpkg (Opsional) | Alat manajemen pustaka dependensi | Kami merekomendasikan Anda menggunakan versi terbaru. |
libcurl | Pustaka protokol lapisan aplikasi | 7.33.0 dan yang lebih baru. |
apr/apr-util | Pustaka komponen lintas platform untuk C dan C++ | 1.5.2 dan yang lebih baru. |
cjson | Pustaka parser string JSON | Kami merekomendasikan Anda menggunakan versi terbaru. |
1. Instal alat pembuatan
Proses pembuatan melibatkan pengkloningan kode dari GitHub, menggunakan CMake untuk membangun proyek, serta GCC atau G++ untuk kompilasi. Pastikan CLI berikut telah terinstal di komputer Anda. Jika belum, jalankan perintah yang disediakan:
Ubuntu atau Debian
sudo apt update sudo apt install -y git cmake gcc g++Alibaba Cloud, CentOS Stream, atau 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 cmakeCatatanbrew adalah manajer paket eksternal. Untuk menggunakannya, instal brew terlebih dahulu.
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"Windows
Unduh dan instal Visual Studio. Untuk workload, pilih Desktop development with C++.
2. Instal pustaka dependensi
SDK membutuhkan libcurl versi 7.33.0 atau lebih baru untuk operasi jaringan, apr atau apr-util versi 1.5.2 atau lebih baru untuk manajemen memori lintas platform, serta cJSON untuk mengurai respons server. SDK tidak menyertakan pustaka eksternal ini. Pastikan pustaka tersebut terinstal dan tambahkan direktori file header serta pustaka ke proyek Anda. Contoh ini mendukung instalasi berbasis VCPKG atau instalasi manual pustaka C/C++.
2.1 Instalasi menggunakan VCPKG
Instal pustaka dependensi SDK.
macOS atau Linux
./vcpkg install apr apr-util curl[openssl,http2] cjsonWindows
.\vcpkg.exe install apr apr-util curl[openssl,http2] cjsonCatatanSecara default, VCPKG menginstal library yang sesuai dengan platform saat ini. Untuk melakukan kompilasi lintas platform—misalnya mengompilasi library x86 di lingkungan Windows x64—Anda harus menentukan triplet. Berikut contoh perintahnya:
./vcpkg.exe install apr:x86-windows apr-util:x86-windows curl[openssl,http2]:x86-windows cjson:x86-windows
2.2 Instalasi manual
Ubuntu atau Debian
sudo apt update sudo apt install -y libcurl4-openssl-dev libapr1-dev libaprutil1-dev libcjson-devAlibaba Cloud, CentOS Stream, atau 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
Jika paket cJSON tidak dapat diinstal secara otomatis menggunakan package manager pada platform UNIX-like, jalankan perintah berikut untuk menginstalnya:
git clone https://github.com/DaveGamble/cJSON.git && cd cJSON && mkdir build && cd build && cmake ../ && sudo make install && cd ../../ && rm -rf cJSONLangkah 2: Instal SDK
Linux atau macOS
git clone https://github.com/aliyun/alibabacloud-httpdns-c-sdk.git cd alibabacloud-httpdns-c-sdk mkdir build cd build # Jika library dependensi diinstal menggunakan VCPKG, tambahkan parameter Cmake: -DVCPKG_ROOT=${Installation directory of VCPKG} cmake -DCMAKE_BUILD_TYPE=Release ../ make hdns_unite_test sudo make install sudo ldconfigWindows
Unduh proyek CMake.
Buka proyek CMake di Visual Studio.
Tambahkan parameter CMake dalam konfigurasi manajemen: -DVCPKG_ROOT=${Direktori instalasi VCPKG}
Langkah 3: Integrasi SDK
Untuk detail lebih lanjut tentang integrasi SDK, lihat Contoh integrasi. Bagian berikut menjelaskan langkah-langkah integrasi SDK.
3.1. Impor SDK
Untuk mengintegrasikan SDK, impor pustaka dan file header yang diinstal secara lokal. Tambahkan perintah berikut ke file CMakeLists.txt proyek CMake:
find_library(HTTPDNS_LIBRARY httpdns_c_sdk_static)
include_directories(${CMAKE_INSTALL_PREFIX}/include/httpdns)3.2 Inisialisasi SDK
Inisialisasi lingkungan runtime SDK.
if (hdns_sdk_init() != HDNS_OK) {
hdns_sdk_cleanup();
}
// Gunakan API dari SDK.
3.3 Buat klien
hdns_client_t *client = hdns_client_create(HTTPDNS_ACCOUNT, HTTPDNS_SECRET);
if (client == NULL) {
hdns_sdk_cleanup();
}
// Gunakan Klien HTTPDNS.HTTPDNS_ACCOUNT menentukan ID akun yang ditetapkan oleh HTTPDNS. Untuk informasi lebih lanjut tentang cara memperoleh ID, lihat Gunakan layanan.
HTTPDNS_SECRET menentukan kunci untuk menandatangani permintaan. Jika autentikasi tidak diperlukan, atur parameter ini ke NULL. Jika autentikasi diperlukan, tentukan parameter ini. Untuk detailnya, lihat Pengembangan dan konfigurasi.
3.4 Konfigurasikan klien
Setelah klien dibuat, konfigurasikan pengaturan berikut untuk menyesuaikan klien HTTPDNS:
// Periode batas waktu permintaan. Unit: milidetik.
hdns_client_set_timeout(client, 2000);
// Tentukan apakah akan mengaktifkan caching lokal.
hdns_client_set_using_cache(client, true);
// Tentukan apakah akan menggunakan HTTPS untuk mengakses server HTTPDNS.
hdns_client_set_using_https(client, true);
// Tentukan apakah akan menandatangani permintaan.
hdns_client_set_using_sign(client, true);
// Jumlah percobaan ulang permintaan.
hdns_client_set_retry_times(client, 1);
// Kluster layanan HTTPDNS.
hdns_client_set_region(client, "global");
// Kluster penjadwalan HTTPDNS.
hdns_client_set_schedule_center_region(client, "cn");
// Tentukan apakah akan memperbarui cache lokal setelah perubahan jaringan.
hdns_client_enable_update_cache_after_net_change(client, true);
// Tentukan apakah akan mengizinkan HTTPDNS memperoleh data kedaluwarsa dari cache.
hdns_client_enable_expired_ip(client, true);
// Tentukan apakah akan secara otomatis menggunakan server Domain Name System (DNS) lokal.
hdns_client_enable_failover_localdns(client, true);
// Nama domain yang ingin Anda pra-resolve.
hdns_client_add_pre_resolve_host(client, "www.aliyun.com");
// Tambahkan sniffing IP.
hdns_client_add_ip_probe_item(client, "www.aliyun.com", 443);
// Waktu hidup (TTL) kustom.
hdns_client_add_custom_ttl_item(client, "www.aliyun.com", 120);
Jika Anda mengatur parameter hdns_client_set_using_https ke `true`, biaya Anda akan meningkat. Untuk informasi selengkapnya, lihat dokumen Penagihan Produk.
3.5 Mulai klien
hdns_client_start(client);3.6 Resolusi nama domain
Setelah klien dimulai, panggil API yang disediakan oleh SDK untuk menyelesaikan nama domain. SDK menyediakan beberapa operasi untuk skenario berbeda. Berikut adalah contoh resolusi nama domain tunggal menggunakan operasi sinkron.
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 Pilih alamat IP
Setelah mendapatkan hasil resolusi nama domain, Anda dapat mengakses beban kerja pelanggan menggunakan alamat IP tempat nama domain tersebut di-resolve.
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 Akses beban kerja
static void mock_access_business_web_server(const char *dst_ip) {
CURL *curl;
CURLcode res;
curl = curl_easy_init();
if (curl) {
// Gabungkan URL permintaan.
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);
// Tentukan host dan alamat IP yang telah diselesaikan sebelumnya untuk Permintaan HTTPS.
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);
// Panggil balik.
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data_callback);
#if defined(_WIN32)
curl_easy_setopt(curl, CURLOPT_SSL_OPTIONS, CURLSSLOPT_NATIVE_CA);
#endif
// Ajukan permintaan HTTP.
res = curl_easy_perform(curl);
if (res != CURLE_OK) {
fprintf(stderr, "curl_easy_perform() gagal, url=%s, ip=%s, error=%s\n",
url,
dst_ip,
curl_easy_strerror(res));
}
// Lepaskan sumber daya terkait akses beban kerja.
curl_slist_free_all(dns);
/* selalu bersihkan */
curl_easy_cleanup(curl);
}
}
3.9 Pembersihan client
Jika klien tidak lagi diperlukan, lepaskan klien tersebut.
hdns_client_cleanup(client);3.10 Lepaskan sumber daya SDK
Jika sumber daya SDK tidak lagi diperlukan, lepaskan sumber daya tersebut.
hdns_sdk_cleanup();