程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> libcurl庫進行http通訊-基於 C 的 HTTP 客戶端

libcurl庫進行http通訊-基於 C 的 HTTP 客戶端

編輯:關於C語言

libcurl庫進行http通訊-基於 C 的 HTTP 客戶端


之前兩篇博客介紹了一些最簡單的基本知識,今天就來應用一下,寫一個HTTP客戶端。

首先包含curl的頭文件。
接下來,定義了兩個用於傳輸的變量。第一個變量是 wr_buf,表示將在其中寫入傳入數據的緩沖區。wr_index表示緩沖區的當前寫入索引。

看看 main函數,該函數使用 easy API 進行設置。所有 cURL 調用都通過維護特定請求狀態的句柄進行操作。這稱為 CURL指針引用。本例還創建一個特殊的返回碼,稱為 CURLcode。 在使用任何 libcurl 函數之前,您需要調用 curl_easy_init獲取 CURL句 柄。接下來,注意 curl_easy_setopt調用的數量。它們為特定的操作配置句柄。對於這些調用,您提供句柄、命令 和選項。首先,本例使用 CURLOPT_URL指定要獲取的 URL。然後,它使用 CURL_WRITEDATA提 供一個上下文變量(在本例中,它是內部的 write 錯誤變量)。最後,它使用 CURLOPT_WRITEFUNCTION指 定數據可用時應該調用的函數。在啟動 API 之後,API 將使用它讀取的數據多次調用該函數。

要開始傳輸,調用 curl_easy_perform。它的工作是根據之前的配置執行傳輸。調用該函數時,在完成傳輸 或發生錯誤之前該函數不會返回。main的最後一步是提交返回狀態,提交頁面讀取,最後使用 curl_easy_cleanup清 除(當使用句柄執行完操作後)。

現在看看 write_data函數。該函數是針對特定操作收到數據時調用的回調。注意,當您從網站讀取數據時,將寫入 該數據(write_data)。將向回調提供一個緩沖區(包含可用數據)、成員數量和大小(緩沖中可用數據總量)、上下文指 針。第一個任務是確保緩沖區(wr_buf)的空間足以寫入數據。如果不夠,它將設置上下文指針並返回 0,表示出現問題。否則,它將 cURL 緩沖區的數據復制到您的緩沖區,並增加索引,指向要寫入的下一個位置。本例還終止字符串,稍後可以對其使用 printf。 最後,它返回 libcurl 操作的字節數量。這將告訴 libcurl 數據被提取,它也可以丟棄該數據。這就是從網站將文件讀取到內存的相對簡單的方法。

#include  
#include  
#include "curl.h"

#define MAX_BUF      65536 

char wr_buf[MAX_BUF + 1];
int  wr_index;

/*
* Write data callback function (called within the context of
* curl_easy_perform.
*/
size_t write_data(void *buffer, size_t size, size_t nmemb, void *userp)
{
    int segsize = size * nmemb;

    /* Check to see if this data exceeds the size of our buffer. If so,
    * set the user-defined context value and return 0 to indicate a
    * problem to curl.
    */
    if (wr_index + segsize > MAX_BUF) {
        *(int *)userp = 1;
        return 0;
    }

    /* Copy the data from the curl buffer into our buffer */
    memcpy((void *)&wr_buf[wr_index], buffer, (size_t)segsize);

    /* Update the write index */
    wr_index += segsize;

    /* Null terminate the buffer */
    wr_buf[wr_index] = 0;

    /* Return the number of bytes received, indicating to curl that all is okay */
    return segsize;
}


/*
* Simple curl application to read the index.html file from a Web site.
*/
int main(void)
{
    CURL *curl;
    CURLcode ret;
    int  wr_error;

    wr_error = 0;
    wr_index = 0;

    /* First step, init curl */
    curl = curl_easy_init();
    if (!curl) {
        printf("couldn't init curl ");
        return 0;
    }

    /* Tell curl the URL of the file we're going to retrieve */
    curl_easy_setopt(curl, CURLOPT_URL, "www.exampledomain.com");

    /* Tell curl that we'll receive data to the function write_data, and
    * also provide it with a context pointer for our error return.
    */
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&wr_error);
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);

    /* Allow curl to perform the action */
    ret = curl_easy_perform(curl);

    printf("ret = %d (write_error = %d) ", ret, wr_error);

    /* Emit the page if curl indicates that no errors occurred */
    if (ret == 0) printf("%s ", wr_buf);

    curl_easy_cleanup(curl);

    return 0;
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved