Libcurl 使用与编程

libcurl简介及其编程应用 阅读详情
1,Libcurl 简明使用指南
Libcurl为一个免费开源的,客户端url传输库,支持FTP,FTPS,TFTP,HTTP,HTTPS,GOPHER,TELNET,DICT,FILE和LDAP,跨平台,支持Windows,Unix,Linux等,线程安全,支持Ipv6。并且易于使用。
http://curl.haxx.se/libcurl/

从http://curl.haxx.se/libcurl/ 下载一个稳定的版本,注意选择OS。

编译libcurl
下载下来的是源码包,需要编译。
解压zip文件,进入curl-7.14.0\lib目录(我下载的是7.14.0)。
编译Debug版本。新建一个批处理bat文件,如buildDebug.bat,内容如下:
call "C:\Program Files\Microsoft Visual Studio\VC98\Bin\vcvars32.bat"
set CFG=debug-dll-ssl-dll-zlib-dll
set OPENSSL_PATH=E:\SSL\openssl-0.9.7e
set ZLIB_PATH=E:\zip\zlib123
nmake -f Makefile.vc6

其输出:libcurld_imp.lib, libcurld.dll

编译Release版本。新建一个批处理文件BuildRelease.bat,内容如下:
call "C:\Program Files\Microsoft Visual Studio\VC98\Bin\vcvars32.bat"
set CFG=release-dll-ssl-dll-zlib-dll
set OPENSSL_PATH=E:\SSL\openssl-0.9.7e
set ZLIB_PATH=E:\zip\zlib123
nmake -f Makefile.vc6

其输出:libcurl_imp.lib, libcurl.dll

上面编译的是libcurl的 dll,使用OpenSSL Dll版本和Zlib Dll版本。如果没有,可以从www.openssl.org 或者http://www.zlib.net/ 下载。
如果需要编译其他版本,可查看Makefile.vc6,设定相应的CFG 参数即可。

商业软件使用libcurl时,只需要包含其copywrite声明即可。

Sample

#include <stdio.h>
#include "../curl-7.14.0/include/curl/curl.h"
#pragma comment(lib, "../curl-7.14.0/lib/libcurl_imp.lib")

int main(void)
{
curl = curl_easy_init();
if(curl) {

    CURLcode res;   
    res = curl_easy_setopt(curl, CURLOPT_PROXY, "Test-pxy08:8080");
    res = curl_easy_setopt(curl, CURLOPT_PROXYTYPE, CURLPROXY_HTTP);
    res = curl_easy_setopt(curl, CURLOPT_URL, "http://www.vckbase.com");
    res = curl_easy_perform(curl);

    if(CURLE_OK == res) {
      char *ct;
      /* ask for the content-type */
      /* http://curl.haxx.se/libcurl/c/curl_easy_getinfo.html */
      res = curl_easy_getinfo(curl, CURLINFO_CONTENT_TYPE, &ct);

      if((CURLE_OK == res) && ct)
        printf("We received Content-Type: %s ", ct);
    }

    /* always cleanup */
    curl_easy_cleanup(curl);
}
return 0;
}





2         LibCurl编程

2.1 LibCurl编程流程
在基于LibCurl的程序里,主要采用callback function (回调函数)的形式完成传输任务,用户在启动传输前设置好各类参数和回调函数,当满足条件时libcurl将调用用户的回调函数实现特定功能。下面是利用libcurl完成传输任务的流程:
1.       调用curl_global_init()初始化libcurl
2.       调用 curl_easy_init()函数得到 easy interface型指针
3.       调用curl_easy_setopt设置传输选项
4.       根据curl_easy_setopt设置的传输选项,实现回调函数以完成用户特定任务
5.       调用curl_easy_perform()函数完成传输任务
6.       调用curl_easy_cleanup()释放内存
在整过过程中设置curl_easy_setopt()参数是最关键的,几乎所有的libcurl程序都要使用它。


2.2 重要函数
1.CURLcode curl_global_init(long flags);
描述:这个函数只能用一次。(其实在调用curl_global_cleanup 函数后仍然可再用),如果这个函数在curl_easy_init函数调用时还没调用,它讲由libcurl库自动完成。
参数:flags
CURL_GLOBAL_ALL                      //初始化所有的可能的调用。
CURL_GLOBAL_SSL                      //初始化支持 安全套接字层。
CURL_GLOBAL_WIN32            //初始化win32套接字库。
CURL_GLOBAL_NOTHING         //没有额外的初始化。

2 void curl_global_cleanup(void);
描述:在结束libcurl使用的时候,用来对curl_global_init做的工作清理。类似于close的函数。

3 char *curl_version( );
描述: 打印当前libcurl库的版本。

4 CURL *curl_easy_init( );
描述:curl_easy_init用来初始化一个CURL的指针(有些像返回FILE类型的指针一样). 相应的在调用结束时要用curl_easy_cleanup函数清理.
一般curl_easy_init意味着一个会话的开始. 它的返回值一般都用在easy系列的函数中.

5 void curl_easy_cleanup(CURL *handle);
描述:这个调用用来结束一个会话.与curl_easy_init配合着用. 
参数:CURL类型的指针.

6 CURLcode curl_easy_setopt(CURL *handle, CURLoption option, parameter);
描述: 这个函数最重要了.几乎所有的curl 程序都要频繁的使用它.它告诉curl库.程序将有如何的行为.比如要查看一个网页的html代码等.(这个函数有些像ioctl函数)
参数:
1 CURL类型的指针
2 各种CURLoption类型的选项.(都在curl.h库里有定义,man 也可以查看到)
3 parameter 这个参数 既可以是个函数的指针,也可以是某个对象的指针,也可以是个long型的变量.它用什么这取决于第二个参数.
CURLoption 这个参数的取值很多.具体的可以查看man手册.

7 CURLcode curl_easy_perform(CURL *handle);描述:这个函数在初始化CURL类型的指针 以及curl_easy_setopt完成后调用. 就像字面的意思所说perform就像是个舞台.让我们设置的option 运作起来.
参数:CURL类型的指针.

3.3 curl_easy_setopt函数介绍
本节主要介绍curl_easy_setopt中跟http相关的参数。注意本节的阐述都是以libcurl作为主体,其它为客体来阐述的。
1.     CURLOPT_URL 
设置访问URL

2.       CURLOPT_WRITEFUNCTION,CURLOPT_WRITEDATA
回调函数原型为:size_t function( void *ptr, size_t size, size_t nmemb, void *stream); 函数将在libcurl接收到数据后被调用,因此函数多做数据保存的功能,如处理下载文件。CURLOPT_WRITEDATA用于表明CURLOPT_WRITEFUNCTION函数中的stream指针的来源。

3.      CURLOPT_HEADERFUNCTION,CURLOPT_HEADERDATA
回调函数原型为 size_t function( void *ptr, size_t size,size_t nmemb, void *stream); libcurl一旦接收到http 头部数据后将调用该函数。CURLOPT_WRITEDATA 传递指针给libcurl,该指针表明CURLOPT_HEADERFUNCTION 函数的stream指针的来源。

4.       CURLOPT_READFUNCTION CURLOPT_READDATA
libCurl需要读取数据传递给远程主机时将调用CURLOPT_READFUNCTION指定的函数,函数原型是:size_t function(void *ptr, size_t size, size_t nmemb,void *stream). CURLOPT_READDATA 表明CURLOPT_READFUNCTION函数原型中的stream指针来源。

5.       CURLOPT_NOPROGRESS,CURLOPT_PROGRESSFUNCTION,CURLOPT_PROGRESSDATA
跟数据传输进度相关的参数。CURLOPT_PROGRESSFUNCTION 指定的函数正常情况下每秒被libcurl调用一次,为了使CURLOPT_PROGRESSFUNCTION被调用,CURLOPT_NOPROGRESS必须被设置为false,CURLOPT_PROGRESSDATA指定的参数将作为CURLOPT_PROGRESSFUNCTION指定函数的第一个参数

6.       CURLOPT_TIMEOUT,CURLOPT_CONNECTIONTIMEOUT:
CURLOPT_TIMEOUT 由于设置传输时间,CURLOPT_CONNECTIONTIMEOUT 设置连接等待时间

7.       CURLOPT_FOLLOWLOCATION
设置重定位URL
CURLOPT_RANGE: CURLOPT_RESUME_FROM:
断点续传相关设置。CURLOPT_RANGE 指定char *参数传递给libcurl,用于指明http域的RANGE头域,
例如:
表示头500个字节:bytes=0-499
表示第二个500字节:bytes=500-999
表示最后500个字节:bytes=-500
表示500字节以后的范围:bytes=500-
第一个和最后一个字节:bytes=0-0,-1

同时指定几个范围:bytes=500-600,601-999
    CURLOPT_RESUME_FROM 传递一个long参数给libcurl,指定你希望开始传递的偏移量。

3.4 curl_easy_perform 函数说明(error 状态码)
该函数完成curl_easy_setopt指定的所有选项,本节重点介绍curl_easy_perform的返回值。返回0意味一切ok,非0代表错误发生。
主要错误码说明:
1.    CURLE_OK 
    任务完成一切都好

2     CURLE_UNSUPPORTED_PROTOCOL
    不支持的协议,由URL的头部指定

3     CURLE_COULDNT_CONNECT
    不能连接到remote 主机或者代理

4     CURLE_REMOTE_ACCESS_DENIED
    访问被拒绝

5     CURLE_HTTP_RETURNED_ERROR
    Http返回错误

6           CURLE_READ_ERROR
读本地文件错误


3, 例程
3.1 获取html网页

#include <stdio.h>
#include <curl/curl.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
    CURL *curl;             //定义CURL类型的指针
    CURLcode res;           //定义CURLcode类型的变量,保存返回状态码
    if(argc!=2)
    {
        printf("Usage : file <url>;\n");
        exit(1);
    }
    curl = curl_easy_init();        //初始化一个CURL类型的指针
    if(curl!=NULL)
    {
        //设置curl选项. 其中CURLOPT_URL是让用户指定url. argv[1]中存放的命令行传进来的网址
        curl_easy_setopt(curl, CURLOPT_URL, argv[1]);      

        //调用curl_easy_perform 执行我们的设置.并进行相关的操作. 在这里只在屏幕上显示出来.
        res = curl_easy_perform(curl);

        //清除curl操作.
        curl_easy_cleanup(curl);
    }
    return 0;
}

编译gcc get_http.c -o get_http –lcurl
./ get_http www.baidu.com

3.2 网页下载保存实例
// 采用CURLOPT_WRITEFUNCTION 实现网页下载保存功能
#include <stdio.h>;
#include <stdlib.h>;
#include <unistd.h>;
#include <curl/curl.h>;
#include <curl/types.h>;
#include <curl/easy.h>;
FILE *fp; //定义FILE类型指针
//这个函数是为了符合CURLOPT_WRITEFUNCTION而构造的
//完成数据保存功能
size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream)
{
    int written = fwrite(ptr, size, nmemb, (FILE *)fp);
    return written;
}
int main(int argc, char *argv[])
{
    CURL *curl;
    curl_global_init(CURL_GLOBAL_ALL);
    curl=curl_easy_init();
    curl_easy_setopt(curl, CURLOPT_URL, argv[1]);
    if((fp=fopen(argv[2],"w"))==NULL)
    {
        curl_easy_cleanup(curl);
        exit(1);
    }
////CURLOPT_WRITEFUNCTION 将后继的动作交给write_data函数处理
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
    curl_easy_perform(curl);
    curl_easy_cleanup(curl);
    exit(0);
}

编译gcc save_http.c -o save_http –lcurl
./ save_http www.baidu.com /tmp/baidu

3.3 进度条实例??显示文件下载进度
// 采用CURLOPT_NOPROGRESS, CURLOPT_PROGRESSFUNCTION    CURLOPT_PROGRESSDATA 实现文件传输进度提示功能
//函数采用了gtk库,故编译时需指定gtk库
//函数启动专门的线程用于显示gtk 进度条bar
#include <stdio.h>
#include <gtk/gtk.h>
#include <curl/curl.h>
#include <curl/types.h> /* new for v7 */
#include <curl/easy.h> /* new for v7 */
GtkWidget *Bar;
////这个函数是为了符合CURLOPT_WRITEFUNCTION而构造的
//完成数据保存功能
size_t my_write_func(void *ptr, size_t size, size_t nmemb, FILE *stream)
{
return fwrite(ptr, size, nmemb, stream);
}

//这个函数是为了符合CURLOPT_READFUNCTION而构造的
//数据上传时使用
size_t my_read_func(void *ptr, size_t size, size_t nmemb, FILE *stream)
{
return fread(ptr, size, nmemb, stream);
}

//这个函数是为了符合CURLOPT_PROGRESSFUNCTION而构造的
//显示文件传输进度,t代表文件大小,d代表传输已经完成部分
int my_progress_func(GtkWidget *bar,
                     double t, /* dltotal */
                     double d, /* dlnow */
                     double ultotal,
                     double ulnow)
{
/* printf("%d / %d (%g %%)\n", d, t, d*100.0/t);*/
gdk_threads_enter();
gtk_progress_set_value(GTK_PROGRESS(bar), d*100.0/t);
gdk_threads_leave();
return 0;
}

void *my_thread(void *ptr)
{
CURL *curl;
CURLcode res;
FILE *outfile;
gchar *url = ptr;
curl = curl_easy_init();
if(curl)
{
    outfile = fopen("test.curl", "w");
    curl_easy_setopt(curl, CURLOPT_URL, url);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, outfile);
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, my_write_func);
    curl_easy_setopt(curl, CURLOPT_READFUNCTION, my_read_func);
    curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 0L);
    curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, my_progress_func);
    curl_easy_setopt(curl, CURLOPT_PROGRESSDATA, Bar);
    res = curl_easy_perform(curl);
    fclose(outfile);
    /* always cleanup */
    curl_easy_cleanup(curl);
}
return NULL;
}

int main(int argc, char **argv)
{
GtkWidget *Window, *Frame, *Frame2;
GtkAdjustment *adj;
/* Must initialize libcurl before any threads are started */
curl_global_init(CURL_GLOBAL_ALL);
/* Init thread */
g_thread_init(NULL);
gtk_init(&argc, &argv);
Window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
Frame = gtk_frame_new(NULL);
gtk_frame_set_shadow_type(GTK_FRAME(Frame), GTK_SHADOW_OUT);
gtk_container_add(GTK_CONTAINER(Window), Frame);
Frame2 = gtk_frame_new(NULL);
gtk_frame_set_shadow_type(GTK_FRAME(Frame2), GTK_SHADOW_IN);
gtk_container_add(GTK_CONTAINER(Frame), Frame2);
gtk_container_set_border_width(GTK_CONTAINER(Frame2), 5);
adj = (GtkAdjustment*)gtk_adjustment_new(0, 0, 100, 0, 0, 0);
Bar = gtk_progress_bar_new_with_adjustment(adj);
gtk_container_add(GTK_CONTAINER(Frame2), Bar);
gtk_widget_show_all(Window);
if (!g_thread_create(&my_thread, argv[1], FALSE, NULL) != 0)
    g_warning("can't create the thread");

gdk_threads_enter();
gtk_main();
gdk_threads_leave();
return 0;
}

编译export PKG_CONFIG_PATH=/usr/lib/pkgconfig/
gcc progress.c –o progress ` pkg-config --libs –cflags gtk+-2..0` -lcurl –lgthread-2.0
./ progress http://software.sky-union.cn/index.asp

3.4 断点续传实例
//采用CURLOPT_RESUME_FROM_LARGE 实现文件断点续传功能
#include <stdlib.h>
#include <stdio.h>
#include <sys/stat.h>
#include <curl/curl.h>
//这个函数为CURLOPT_HEADERFUNCTION参数构造

/* 从http头部获取文件size*/
size_t getcontentlengthfunc(void *ptr, size_t size, size_t nmemb, void *stream) {
       int r;
       long len = 0;
       /* _snscanf() is Win32 specific */
       // r = _snscanf(ptr, size * nmemb, "Content-Length: %ld\n", &len);
r = sscanf(ptr, "Content-Length: %ld\n", &len);
       if (r) /* Microsoft: we don't read the specs */
              *((long *) stream) = len;
       return size * nmemb;
}

/* 保存下载文件 */
size_t wirtefunc(void *ptr, size_t size, size_t nmemb, void *stream)
{
        return fwrite(ptr, size, nmemb, stream);
}

/*读取上传文件 */
size_t readfunc(void *ptr, size_t size, size_t nmemb, void *stream)
{
       FILE *f = stream;
       size_t n;
       if (ferror(f))
              return CURL_READFUNC_ABORT;
       n = fread(ptr, size, nmemb, f) * size;
       return n;
}

// 下载 或者上传文件函数
int download(CURL *curlhandle, const char * remotepath, const char * localpath,
           long timeout, long tries)
{
       FILE *f;
       curl_off_t local_file_len = -1 ;
       long filesize =0 ; 
       CURLcode r = CURLE_GOT_NOTHING;
       int c;
struct stat file_info;
int use_resume = 0;
/* 得到本地文件大小 */
//if(access(localpath,F_OK) ==0)
    if(stat(localpath, &file_info) == 0)
     {
        local_file_len = file_info.st_size;
        use_resume = 1;
      }
//采用追加方式打开文件,便于实现文件断点续传工作
       f = fopen(localpath, "ab+");
       if (f == NULL) {
              perror(NULL);
              return 0;
       }
       //curl_easy_setopt(curlhandle, CURLOPT_UPLOAD, 1L);
       curl_easy_setopt(curlhandle, CURLOPT_URL, remotepath);
     curl_easy_setopt(curlhandle, CURLOPT_CONNECTTIMEOUT, timeout); // 设置连接超时,单位秒
       //设置http 头部处理函数
       curl_easy_setopt(curlhandle, CURLOPT_HEADERFUNCTION, getcontentlengthfunc);
       curl_easy_setopt(curlhandle, CURLOPT_HEADERDATA, &filesize);

// 设置文件续传的位置给libcurl
       curl_easy_setopt(curlhandle, CURLOPT_RESUME_FROM_LARGE, use_resume?local_file_len:0);
       curl_easy_setopt(curlhandle, CURLOPT_WRITEDATA, f);
       curl_easy_setopt(curlhandle, CURLOPT_WRITEFUNCTION, wirtefunc);
       //curl_easy_setopt(curlhandle, CURLOPT_READFUNCTION, readfunc);
       //curl_easy_setopt(curlhandle, CURLOPT_READDATA, f);
       curl_easy_setopt(curlhandle, CURLOPT_NOPROGRESS, 1L);
       curl_easy_setopt(curlhandle, CURLOPT_VERBOSE, 1L);

r = curl_easy_perform(curlhandle);   

       fclose(f);

       if (r == CURLE_OK)

              return 1;

       else {

              fprintf(stderr, "%s\n", curl_easy_strerror(r));

              return 0;

       }

}

int main(int c, char **argv) {

       CURL *curlhandle = NULL;

       curl_global_init(CURL_GLOBAL_ALL);

       curlhandle = curl_easy_init();

       //download(curlhandle, "ftp://user:pass@host/path/file", "C:\\file", 0, 3);

download(curlhandle , "http://software.sky-union.cn/index.asp","/work/index.asp",1,3);

       curl_easy_cleanup(curlhandle);

       curl_global_cleanup();

       return 0;

}

编译gcc resume.c -o resume –lcurl

./ resume


https客户端的实现(libcurl)
一、              概念

1.         为什么要使用libcurl

1)        作为http的客户端,可以直接用socket连接服务器,然后对到的数据进行http解析,但要分析

协议头,实现代理…这样太麻烦了。

2)        libcurl是一个开源的客户端url传输库,支持FTP,FTPS,TFTP,HTTP,HTTPS,GOPHER,

TELNET,DICT,FILE和LDAP,支持Windows,Unix,Linux等平台,简单易用,且库文件占用空间不到200K

2.         get和post方式

客户端在http连接时向服务提交数据的方式分为get和post两种

1)        Get方式将所要传输的数据附在网址后面,然后一起送达服务器,它的优点是效率比较高;缺

点是安全性差、数据不超过1024个字符、必须是7位的ASCII编码;查询时经常用此方法。

2)        Post通过Http post处理发送数据,它的优点是安全性较强、支持数据量大、支持字符多;缺

点是效率相对低;编辑修改时多使用此方法。

3.         cookie与session

1)        cookie
cookie是发送到客户浏览器的文本串句柄,并保存在客户机硬盘上,可以用来在某个Web站点会话之间持

久地保持数据。cookie在客户端。

2)        session
session是访问者从到达某个特定主页到离开为止的那段时间。每一访问者都会单独获得一个session,实

现站点多个用户之间在所有页面中共享信息。session在服务器上。

3)        libcurl中使用cookie
保存cookie, 使之后的链接与此链接使用相同的cookie

a)         在关闭链接的时候把cookie写入指定的文件
curl_easy_setopt(curl, CURLOPT_COOKIEJAR, "/tmp/cookie.txt");

b)        取用现在有的cookie,而不重新得到cookie
curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "/tmp/cookie.txt");

b)        http与https的区别

1)        Http是明文发送,任何人都可以拦截并读取内容

2)        Https是加密传输协议,用它传输的内容都是加密过的,https是http的扩展,其安全基础是

SSL协议

c)        base64编码

1)        为什么要使用base64编码
如果要传一段包含特殊字符比较多的数据,直接上传就需要处理转意符之类的很多问题,用base64编码,

它可以把数据转成可读的字串,base64由a-z, A-Z, +/总计64个字符组成。

2)        传送base64编码的注意事项
由于base64的组成部分有加号,而加号是url中的转意字符,所以无论是get方式还是post,传到服务器的

过程中,都会把加号转成空格,所以在传base64之前需要把base64编码后的加号替换成”%2B”,这样就

可以正常发送了。

二、              例程

d)        代码

#include <stdio.h>

#include <curl/curl.h>


bool getUrl(char *filename)

{

    CURL *curl;

    CURLcode res;

    FILE *fp;

    if ((fp = fopen(filename, "w")) == NULL) // 返回结果用文件存储

         return false;

    struct curl_slist *headers = NULL;

    headers = curl_slist_append(headers, "Accept: Agent-007");

    curl = curl_easy_init();    // 初始化

    if (curl)

    {

         curl_easy_setopt(curl, CURLOPT_PROXY, "10.99.60.201:8080");// 代理

         curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);// 改协议头

         curl_easy_setopt(curl, CURLOPT_URL,                "http://www.google.com/search?

hl=en&q=xieyan0811&btnG=Google+Search&aq=f&oq=xieyan081");

         curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);

         res = curl_easy_perform(curl);   // 执行

         curl_slist_free_all(headers);

         curl_easy_cleanup(curl);

    }

    fclose(fp);

    return true;

}


bool postUrl(char *filename)

{

    CURL *curl;

    CURLcode res;

    FILE *fp;

    if ((fp = fopen(filename, "w")) == NULL)

         return false;

    curl = curl_easy_init();

    if (curl)

    {

         curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "/tmp/cookie.txt"); // 指定cookie文件

         // curl_easy_setopt(curl, CURLOPT_COOKIEJAR, "/tmp/cookie.txt");

         curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "&logintype=uid&u=xieyan&psw=xxx86"); 

// 指定post内容

         curl_easy_setopt(curl, CURLOPT_PROXY, "10.99.60.201:8080");

         curl_easy_setopt(curl, CURLOPT_URL, "http://mail.sina.com.cn/cgi-bin/login.cgi"); 

// 指定url

         curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);

         res = curl_easy_perform(curl);

         curl_easy_cleanup(curl);

    }

    fclose(fp);

    return true;

}


int main(void)

{

    getUrl("/tmp/get.html");

    postUrl("/tmp/post.html");

}

e)         编译

        g++ main.cpp -o main -lcurl

libcurl编程 一、curl简介 curl是一个利用URL语法在命令行方式下工作的文件传输工具。它支持的协议有:FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE 以及 LDAP。curl同样支持HTTPS认证,HTTP POST方法, HTT 阅读详情

相关推荐

libcurl_imp_lib

libcurl_imp.lib 开发要用到的一个文件,如果要配置环境就需要先下载这个文件然后进行加载

基于C/C++的libcurl多协议文件传输库dll二次封装开发使用

libcurl 可能是最便携、最强大和最常用的 这个星球上的网络传输库。官方提供的示例,需要在项目中引用到libcurl-imp.lib才能使用。跟网页访问的结果是一样的。这里我发现有个乱码问题。利用前面提到的转编码问题即可解决。libcurl.dll中接口的导出: libcurl.c。http访问测试应用示例: test.c。相关操作接口的声明:libcurl.h。

无奋斗、无青春! 1305

libcurl_imp.lib

libcurl_imp.lib

#掉过的坑#cocos:无法打开文件libcurl_img.lib

如图,当时我在跑cocos的官方demo.除此,还有个缺少SDK8.1框架的错误。 当时我的运行环境是:win 10, vs2017, cocos 3.10, python 3.4。 上网找了教程引入这个包。重装cocos都不行。 后来怀疑到了python的问题。因为作业ppt要求python2.7.5+。我本来有个3.4的,就以为可以。 然后上官网下了个2.7的python。还装了一个

LoHiauFung的博客 6126

【高等数值分析】Krylov子空间方法

文章目录1. 预备理论1.1 Krylov 子空间1.2 最佳逼近1.2.1 方法一:最佳平方逼近1.2.2 方法二:假设 AAA 对称正定1.2.3 方法三:残差2范数2. 基底正交化2.1 Arnoldi 过程(CGS)2.2 改进 Arnoldi 过程(MGS)2.3 Lanczos过程3. 方程组求解3.1 全正交方法 (FOM)3.2 D-Lanczos方法3.3 广义极小残量法(GMRES)3.4 MINRES 方法 1. 预备理论 现在需要求解一个大规模稀疏方程组 Ax=bAx=bAx=b,可

Glooow的博客 1万+

MQTT在智能家居中的实战:用Android手机控制ESP8266设备(基于EMQX)

本文详细介绍了如何利用MQTT协议构建一个完整的智能家居控制系统,通过Android手机App远程操控ESP8266设备。文章提供了从EMQX服务器部署、ESP8266端Arduino固件开发到Android客户端搭建的完整实战指南,并深入探讨了系统联调、稳定性优化与安全加固等关键环节,为物联网开发者提供了一套可复用的解决方案。

ujm567890的博客 457

Libcurl 简明使用指南

Libcurl 简明使用指南 Libcurl为一个免费开源的,客户端url传输库,支持FTP,FTPS,TFTP,HTTP,HTTPS,GOPHER,TELNET,DICT,FILE和LDAP,跨平台,支持Windows,Unix,Linux等,线程安全,支持Ipv6。并且易于使用。 http://curl.haxx.se/libcurl/   从http://curl.haxx.se

411

AppStore逆向分析:从网络抓包到自动化模拟的完整实践

在移动应用生态中,理解客户端与服务器之间的通信协议是进行自动化测试、数据分析和系统集成的关键技术基础。通过分析网络请求与响应,可以深入理解认证、会话管理和数据交换的原理,这对于构建稳定的自动化流程至关重要。其技术价值在于能够实现合法场景下的流程模拟,例如应用元数据监控、沙盒环境测试或内部工具开发。在实际应用场景中,开发者常需处理登录态维持、请求签名验证及风控策略应对等挑战。本文聚焦于AppStore这一封闭生态,详细拆解了其登录、查询等核心环节的通信机制,并探讨了使用Python结合抓包工具进行安全逆向分析

weixin_42524171的博客 926

linux下LibCurl编程

1         LibCurl简介 LibCurl是免费的客户端URL传输库,支持FTP,FTPS, HTTP, HTTPS, SCP, SFTP, TFTP, TELNET, DICT, FILE ,LDAP等协议,其主页是http://curl.haxx.se/。Libcurl具备线程安全、IpV6兼容、易于使用的特点。本文档主要介绍LibCurl在http协议方面的应用。 1.1HT

followingturing 追随图灵的路上... 8876

保姆级教程:QGC地面站Vehicle Setup全模块配置详解(从固件升级到安全设置)

本文提供QGC地面站Vehicle Setup全模块配置的保姆级教程,涵盖从固件升级到安全设置的完整流程。详细解析二次开发环境准备、传感器校准、飞行模式配置等关键步骤,帮助用户快速掌握无人机配置技巧,确保飞行安全与性能优化。

weixin_28726671的博客 386

时间序列数据预测——15种时序大模型

本文综述了时间序列大模型(TSFM)的最新进展,系统介绍了11种主流模型(如TimeGPT、Lag-Llama、Moirai等)的架构特点、训练数据和创新点,并对比分析了它们在单变量/多变量预测、概率预测等功能上的差异。研究表明,基于"大规模预训练-微调/零样本"范式的TSFM在标准数据集(如M4、ETT)上展现出优于传统方法的性能,Time-MoE等模型更达到SOTA水平。但TSFM仍面临计算成本高、可解释性差等挑战,未来发展方向包括轻量级架构、多模态融合和可解释性增强。

m0_56592100的博客 4069

LibCurl编程

<br />2.1 LibCurl编程流程<br />在基于LibCurl的程序里,主要采用callback function (回调函数)的形式完成传输任务,用户在启动传输前设置好各类参数和回调函数,当满足条件时libcurl将调用用户的回调函数实现特定功能。下面是利用libcurl完成传输任务的流程:<br />1.       调用curl_global_init()初始化libcurl<br />2.       调用 curl_easy_init()函数得到 easy interface型指针<b

scollins的专栏 1298

Win10下ISE14.7安装避坑全记录:从License加载失败到ChipScope连不上,我踩过的雷都在这了

本文详细记录了在Win10系统下安装ISE14.7时遇到的常见问题及解决方案,包括License加载失败、IMPACT闪退、ChipScope连接故障等。通过实际案例和步骤解析,帮助用户避开安装陷阱,确保FPGA开发工具顺利运行。特别针对license问题提供了兼容性设置和文件修改的实用技巧。

weixin_42683394的博客 225

在ubuntu下使用LibCurl库简单编程练习

学习LibCurl库

weixin_45888898的博客 1476

使用PLINK做GWAS(2)

利用PLINK对单基因控制的性状进行定位,之前一篇文章粗滤的记录了一下使用PLINK的命令,本次博客主要记录一下如何根据SNP芯片的数据制作PLINK的格式,以及分析的步骤,最后数据的可视化。 首先,有的公司给的新片的数据就是一个excel表格,列表示的是样品,行表示的是基因型,基因型用ATCG构成,当然有的基因型是用数字0或者1表示的。下面我拿到的一个数据是15个样品构成的基因型,有13个样品是突变体,2个样品是野生型。 格式如下: 第二步:将此基因型存成csv文件,使用R进行读取,在R中制作pl

samhuairen的专栏 2921

在 SAP HANA 里为视图创建 Analytic Privilege,真正把同一份数据按角色切开

摘要:本文介绍了SAP HANA中基于业务角色的动态数据权限控制方法。通过Analytic Privilege技术,可以在同一视图上为不同角色设置不同的数据访问范围,实现行级安全控制。核心机制包括:1) 创建带有STRUCTURED PRIVILEGE CHECK的视图;2) 建立授权对象和用户映射表;3) 开发条件提供过程动态生成过滤条件;4) 创建结构化权限对象绑定条件提供器。这种设计使权限规则与业务数据解耦,便于维护变更,适合销售区域、财务数据等多角色访问控制场景。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 2392

libcurl编程教程

毕业设计翻译了一部分libcurl的编程教程,包含中文翻译及英文原文。现在分享出来以供大家参考。 libcurl编程教程 1 名称 libcurl-tutorial —— libcurl编程教程 2 目的 本文档尝试描述使用libcurl进行编程时要考虑的一般原则和一些基本方法。 本文将主要集中在基于C的接口上,但是在其他接近C语言的接口上也能很好地应用,通常它们跟C一样。

ms347397173的博客 891

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Linux下LibCurl编程

1 LibCurl简介 LibCurl是免费的客户端URL传输库,支持FTP,FTPS, HTTP, HTTPS, SCP, SFTP, TFTP, TELNET, DICT, FILE ,LDAP等协议,其主页是http://curl.haxx.se/。Libcurl具备线程安全、IpV6兼容、易于使用的特点。本文档主要介绍LibCurl在http协议方面的应用。 1.1 HTTP协议格式

bytxl的专栏 1072

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

libcurl库相关编程

Libcurl库简介 在linux下用c语言做HTTP的编程有一种方法是依赖于这个libcurlv库,以后做跨平台网络协议相关的开发,第一个要想到的就是它。 libcurl是一个跨平台的网络协议库,支持http, https, ftp等协议,libcurl同样支持: (1)HTTPS证书授权 (2)HTTP POST, HTTP PUT, FTP 上传 (3) HTTP基本表单上传,代理,cookies,和用户认证 Libcurl库的下载安装就不用多操作了 libcurl函数库常用字段解读

举子人间 242

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

c++ LibCurl编程

LibCurl编程 2.1 LibCurl编程流程 在基于LibCurl的程序里,主要采用callback function (回 调函数)的形式完成传输任务,用户在启动传输前设置好各类参数和回调函数,当满足条件时libcurl将调用用户的回调函数实现特定功能。下面是利用libcurl完成传输任务的流程: 1.      调用curl_global_init()初始化libcurl 2.

beyondlpf的专栏 1270

libcurl库的介绍和使用,并调用libcurl库编程访问百度主页

libcurl库的介绍和使用,并调用libcurl库编程访问百度主页

Li_t0010的博客 2650
上一篇: 学好Python必读的几篇文章
下一篇: uml of linux
bamboolsu
博客等级 码龄22年 200粉丝 394原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值