How to use libcurl

本文将指导您如何使用libcurl库进行文件下载,并通过配置示例和代码演示了跨平台编译及下载流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

How to use libcurl

 

(1). Untar curl-7.21.7.tar.gz to curl-7.21.7
(2). Cross Compile libcurl
     Add one script named configure_cr16.sh in curl-7.21.7, the content is as below:

#! /bin/sh

# copy library binaries
#! /bin/sh
export ROOTDIR=$PWD
export PATH=$PATH:/usr/cr16-tools/bin
export CPPFLAGS="-I/usr/cr16-tools/include"
export AR=cr16-uclinux-ar
export AS=cr16-uclinux-as
export LD=cr16-uclinux-ld
export RANLIB=cr16-uclinux-ranlib
export CC=cr16-uclinux-gcc
export NM=cr16-uclinux-nm

CFLAGS="-mcr16cplus -mdata-model=far -mint32 -fPIC -Wall -O2 -static "   \
./configure --host=cr16-uclinux       \
   --enable-dependency-tracking  \
   --enable-static      \
   --disable-shared     \
   --enable-http       \
   --disable-ftp       \
   --disable-ldap       \
   --disable-dict       \
   --disable-telnet      \
   --disable-tftp       \
   --disable-manual      \
   --disable-nonblocking     \
   --disable-verbose      \
   --disable-debug      \
   --disable-crypto-auth     \
   --without-pic       \
   --with-gnu-ld       \
   --without-ssl       \
   --enable-threads     \
   --prefix=$PWD/../curl_release    \
   --exec-prefix=$PWD/../curl_release

(3). ./configure_cr16.sh && make && make install
   libcurl will be in curl_release.
  
(4). How to use libcurl to download file
   
size_t writeDataToFileCb(void *ptr, size_t size, size_t nmemb, FILE *stream)
{
    size_t len = 0;
    len = fwrite(ptr, size, nmemb, stream);
    return len;
}


static BOOL testHandle(IN void* pList)
{
    struct in_addr IPaddr;
    int port;
    char *pIPAddr = NULL;
    char *pTemp = NULL;
    PS_PARAMETER_NODE tempCmdList;
    int i = 0;
    int nImageNum = 0;

    char szIpAddr[64];
    char szPort[64];
    char szTemp[3][64];
    char *szFileName[2];
    char szCommand[64];

   
    static BOOL blGlobalInit = FALSE;
    CURLcode ret = 0;
    CURL *pCurlHandle = NULL;
    char szUrl[128];
    char szLocalFilePath[128];
    FILE *fp = NULL;
    long respCode = 0;
    long size = 0;
    char szTime[64];
   

    printf("\n\n");


    /* (1). Init libcurl */
    if(blGlobalInit == FALSE)
    {
        ret = curl_global_init(CURL_GLOBAL_DEFAULT);
        if(ret == CURLE_OK)
        {
            printf("In func: %s(), curl_global_init OK\n", __FUNCTION__);
            blGlobalInit = TRUE;   
        }
        else
        {
            printf("In func: %s(), curl_global_init fail, ret = %d\n", __FUNCTION__, ret);
            return 1;
        }
    }


    /* (2). Easy init to get one curl handle */
    pCurlHandle = curl_easy_init();
    if(pCurlHandle == NULL)
    {
        printf("In func: %s(), curl_easy_init fail \n", __FUNCTION__);
        return 1;
    }


    /* (3). Construct the URL */
    memset(szUrl, (char)0, sizeof(szUrl));
    snprintf(szUrl, sizeof(szUrl), "http://%s/%s", szIpAddr, szTemp[0]);


    /* (4). Construct local file path and open file */
    memset(szLocalFilePath, (char)0, sizeof(szLocalFilePath));
    snprintf(szLocalFilePath, sizeof(szLocalFilePath), "/var/%s", szTemp[0]);
    fp = fopen(szLocalFilePath, "wb");
    if(fp == NULL)
    {
        printf("In func: %s(), open file (%s) fail \n", __FUNCTION__, szLocalFilePath);
        goto exit_testHandle;
    }


    /* (5). Set URL option */
    printf("In func: %s(), szUrl = %s, szLocalFilePath = %s \n", __FUNCTION__, szUrl, szLocalFilePath);
    ret = curl_easy_setopt(pCurlHandle, CURLOPT_URL, szUrl);
    if(ret != CURLE_OK)
    {
        printf("In func: %s(), setopt (CURLOPT_URL) fail, ret = %d \n", __FUNCTION__, ret);
        goto exit_testHandle;
    }


    /* (6). Set write function call back */
    ret = curl_easy_setopt(pCurlHandle, CURLOPT_WRITEFUNCTION, writeDataToFileCb);
    if(ret != CURLE_OK)
    {
        printf("In func: %s(), setopt (CURLOPT_WRITEFUNCTION) fail, ret = %d \n", __FUNCTION__, ret);
        goto exit_testHandle;
    }


    /* (7). Set the parameter of call back func */
    ret = curl_easy_setopt(pCurlHandle, CURLOPT_WRITEDATA, fp);
    if(ret != CURLE_OK)
    {
        printf("In func: %s(), setopt (CURLOPT_WRITEDATA) fail, ret = %d \n", __FUNCTION__, ret);
        goto exit_testHandle;
    }

   
    /* (8). Begin to perform */
    memset(szTime, (char)0, sizeof(szTime));
    getCurTime(szTime, sizeof(szTime));
    printf("[%s]: In func: %s(), before perform ......\n", szTime, __FUNCTION__);

    ret = curl_easy_perform(pCurlHandle);

    memset(szTime, (char)0, sizeof(szTime));
    getCurTime(szTime, sizeof(szTime));
    printf("[%s]: In func: %s(), after perform ......\n", szTime, __FUNCTION__);
   
    if(ret != CURLE_OK)
    {
        printf("In func: %s(), curl_easy_perform fail, ret = %d \n", __FUNCTION__, ret);
        goto exit_testHandle;
    }   


    /* (9). Get response code */
    ret= curl_easy_getinfo(pCurlHandle, CURLINFO_RESPONSE_CODE, &respCode);
    if(ret != CURLE_OK)
    {
        printf("In func: %s(), getinfo (CURLINFO_RESPONSE_CODE) fail, ret = %d \n", __FUNCTION__, ret);
        goto exit_testHandle;
    }

    printf("In func: %s(), respCode = %d \n", __FUNCTION__, respCode);
    if(respCode != 200)
    {
        printf("In func: %s(), respCode = %d, download error, delete file\n", __FUNCTION__, respCode);               
        fclose(fp);
        fp = NULL;
        goto exit_testHandle;
        /* need to delete file */
    }


    /* (10). Get response code */
    ret= curl_easy_getinfo(pCurlHandle, CURLINFO_SIZE_DOWNLOAD, &size);
    if(ret != CURLE_OK)
    {
        printf("In func: %s(), getinfo (CURLINFO_RESPONSE_CODE) fail, ret = %d \n", __FUNCTION__, ret);
        goto exit_testHandle;
    }
    printf("In func: %s(), size = %l \n", __FUNCTION__, size);


exit_testHandle:
    curl_easy_cleanup(pCurlHandle);
    if(fp != NULL)
        fclose(fp);

    return 1;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值