在 C 語言中,我們可以使用第三方庫來獲取 IP 中的 JSON 數據。本文將詳細介紹如何使用這些庫。
#include <stdio.h> #include <stdlib.h> #include <cURL/cURL.h> struct MemoryStruct { char *memory; size_t size; }; static size_t WriteMemoryCallback(void *contents, size_t size, size_t nmemb, void *userp) { size_t realsize = size * nmemb; struct MemoryStruct *mem = (struct MemoryStruct *)userp; mem->memory = realloc(mem->memory, mem->size + realsize + 1); if(mem->memory == NULL) { printf("not enough memory (realloc returned NULL)\n"); return 0; } memcpy(&(mem->memory[mem->size]), contents, realsize); mem->size += realsize; mem->memory[mem->size] = 0; return realsize; } int main(void) { CURL *curl; CURLcode res; struct MemoryStruct chunk; chunk.memory = calloc(1, sizeof(char)); chunk.size = 0; curl = curl_easy_init(); if(curl) { curl_easy_setopt(curl, CURLOPT_URL, "http://ipinfo.io/json"); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback); curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk); res = curl_easy_perform(curl); if(res != CURLE_OK) { fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res)); } curl_easy_cleanup(curl); } printf("%s", chunk.memory); free(chunk.memory); return 0; }
在此代碼中,我們使用了 cURL 庫來獲取 IP 中的 JSON 數據。該庫是一個免費的、高性能的、輕量級的 HTTP 客戶端庫,可以使用各種協議,例如 HTTP、HTTPS、FTP 和 SMTP。
在代碼的主體部分,我們定義了一個名為 MemoryStruct 的結構,它用于存儲從服務器返回的 JSON 數據。在 WriteMemoryCallback 函數中,我們將分配足夠的內存,并將服務器返回的數據寫入該內存中。當寫入操作完成之后,我們將返回大小。
在 main 函數中,我們首先定義一個 chunk 變量,并通過調用 calloc 函數來初始化其內存。然后,我們使用 curl_easy_init 函數來初始化 cURL 連接(通過該連接,我們會向服務器發送 HTTP 請求)。接下來,我們設置一些選項,例如 CURLOPT_URL 選項(指定服務器的 URL)、CURLOPT_WRITEFUNCTION 選項(調用以寫入從服務器返回的數據的函數)、CURLOPT_WRITEDATA 選項(在回調函數中使用的用戶數據)。
最后,在調用 curl_easy_perform 函數之后,我們使用 printf 函數打印數據并釋放已分配的內存。