libcurl编程

一、curl简介

curl是一个利用URL语法在命令行方式下工作的文件传输工具。它支持的协议有:FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE 以及 LDAP。curl同样支持HTTPS认证,HTTP POST方法, HTTP PUT方法, FTP上传, kerberos认证, HTTP上传, 代理服务器, cookies, 用户名/密码认证, 下载文件断点续传, 上载文件断点续传, http代理服务器管道( proxy tunneling), 甚至它还支持IPv6, socks5代理服务器, 通过http代理服务器上传文件到FTP服务器等等,功能十分强大。

二、curl安装

下载地址:http://curl.haxx.se/download.html

ubuntu安装:sudo apt-get install curl

libcurl静态库:./configure & make & install

windows:下载curl.exe,cmd进入curl.exe所在目录可以直接使用

三、curl使用

curl的用法为:curl [options] [URL...],其中options是下载需要的参数,大约有80多个,curl的各个功能完全是依靠这些参数完成的。这里只介绍几种简单的用法,详细的curl的参数在http://curl.haxx.se/docs/说明。

 

1、读取网页

curl http://www.linuxidc.com

2、保存网页、下载文件

以page.html命名下载网页:curl –o page.html http://www.linuxidc.com

以服务器上的文件名命名网页:curl –O http://cgi2.tky.3web.ne.jp/~zzh/screen1.JPG

批量下载文件:curl -O http://cgi2.tky.3web.ne.jp/~zzh/screen[1-10].JPG

3、使用代理服务器及其端口

curl –x 127.0.0.1:8580 –o page.html http://www.linuxidc.com

4、使用cookie来记录session信息

cookie 信息存到cookie1.txt中:curl –o page.html –D cookie1.txt http://www.linuxidc.com

使用上次的cookie并生成新的cookie:curl –o page.html –D cookie2.txt  -b cookie2.txt http://www.linuxidc.com

5、断点续传

比如下载screen1.JPG中,突然掉线了,可以这样开始续传:curl -c -O http://cgi2.tky.3wb.ne.jp/~zzh/screen1.JPG

另外可以用-r选项进行分块下载

6、上传文件

比如我们向ftp传一个文件:curl -T localfile -u name:passwd ftp://upload_site:port/path/

PS:对于ftp服务器用-u name:passwd选项

7、http提交一个表单GET与POST模式

GET模式什么option都不用,只需要把变量写在url里面就可以了比如:

$curl http://www.linuxidc.com/login.cgi?user=nickwolfe&password=12345

POST模式的选项是 -d

比如:curl -d "user=nickwolfe&password=12345" http://www.linuxidc.com/login.cgi

四、curl编程

1、curl编程流程

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、重要函数

(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、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,指定你希望开始传递的

偏移量。

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

读本地文件错误

五、curl编程例子

1、获取html网页

view plain
  1. #include <stdio.h>  
  2.   
  3. #include <curl/curl.h>  
  4.   
  5. #include <stdlib.h>  
  6.   
  7. int main(int argc, char *argv[])  
  8.   
  9. {  
  10.   
  11.     CURL *curl;             //定义CURL类型的指针  
  12.   
  13. CURLcode res;           //定义CURLcode类型的变量,保存返回状态码  
  14.   
  15.     if(argc!=2)  
  16.   
  17.     {  
  18.   
  19.         printf("Usage : file <url>;/n");  
  20.   
  21.         exit(1);  
  22.   
  23.     }  
  24.   
  25.     curl = curl_easy_init();        //初始化一个CURL类型的指针  
  26.   
  27.     if(curl!=NULL)  
  28.   
  29. {   
  30.   
  31. //设置curl选项. 其中CURLOPT_URL是让用户指定url. argv[1]中存放的命令行传进来的网址  
  32.   
  33.         curl_easy_setopt(curl, CURLOPT_URL, argv[1]);         
  34.   
  35.         //调用curl_easy_perform 执行我们的设置.并进行相关的操作. 在这里只在屏幕上显示出来.  
  36.   
  37.         res = curl_easy_perform(curl);  
  38.   
  39.         //清除curl操作.  
  40.   
  41.         curl_easy_cleanup(curl);  
  42.   
  43.     }  
  44.   
  45.     return 0;  
  46.   
  47. }  

编译gcc  get_http.c  -o get_http –lcurl

./ get_http www.baidu.com

 

2、网页下载保存

view plain
  1. // 采用CURLOPT_WRITEFUNCTION 实现网页下载保存功能  
  2.   
  3. #include <stdio.h>;  
  4.   
  5. #include <stdlib.h>;  
  6.   
  7. #include <unistd.h>;  
  8.   
  9. #include <curl/curl.h>;  
  10.   
  11. #include <curl/types.h>;  
  12.   
  13. #include <curl/easy.h>;  
  14.   
  15. FILE *fp;  //定义FILE类型指针  
  16.   
  17. //这个函数是为了符合CURLOPT_WRITEFUNCTION而构造的  
  18.   
  19. //完成数据保存功能  
  20.   
  21. size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream)   
  22.   
  23. {  
  24.   
  25.     int written = fwrite(ptr, size, nmemb, (FILE *)fp);  
  26.   
  27.     return written;  
  28.   
  29. }  
  30.   
  31. int main(int argc, char *argv[])  
  32.   
  33. {  
  34.   
  35.     CURL *curl;  
  36.   
  37.     curl_global_init(CURL_GLOBAL_ALL);   
  38.   
  39.     curl=curl_easy_init();  
  40.   
  41.     curl_easy_setopt(curl, CURLOPT_URL, argv[1]);   
  42.   
  43.     if((fp=fopen(argv[2],"w"))==NULL)  
  44.   
  45.     {  
  46.   
  47.         curl_easy_cleanup(curl);  
  48.   
  49.         exit(1);  
  50.   
  51.     }  
  52.   
  53. CURLOPT_WRITEFUNCTION 将后继的动作交给write_data函数处理  
  54.   
  55.     curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);   
  56.   
  57.     curl_easy_perform(curl);  
  58.   
  59.     curl_easy_cleanup(curl);  
  60.   
  61.     exit(0);  
  62.   
  63. }  

编译gcc  save_http.c  -o save_http –lcurl

./ save_http www.baidu.com  /tmp/baidu

 

3、进度条实例(显示文件下载进度)

view plain
  1. // 采用CURLOPT_NOPROGRESS, CURLOPT_PROGRESSFUNCTION    CURLOPT_PROGRESSDATA 实现文件传输进度提示功能  
  2.   
  3. //函数采用了gtk库,故编译时需指定gtk库  
  4.   
  5. //函数启动专门的线程用于显示gtk 进度条bar  
  6.   
  7. #include <stdio.h>  
  8.   
  9. #include <gtk/gtk.h>  
  10.   
  11. #include <curl/curl.h>  
  12.   
  13. #include <curl/types.h> /* new for v7 */  
  14.   
  15. #include <curl/easy.h> /* new for v7 */  
  16.   
  17. GtkWidget *Bar;  
  18.   
  19. 这个函数是为了符合CURLOPT_WRITEFUNCTION而构造的  
  20.   
  21. //完成数据保存功能  
  22.   
  23. size_t my_write_func(void *ptr, size_t size, size_t nmemb, FILE *stream)  
  24.   
  25. {  
  26.   
  27.   return fwrite(ptr, size, nmemb, stream);  
  28.   
  29. }  
  30.   
  31. //这个函数是为了符合CURLOPT_READFUNCTION而构造的  
  32.   
  33. //数据上传时使用  
  34.   
  35. size_t my_read_func(void *ptr, size_t size, size_t nmemb, FILE *stream)  
  36.   
  37. {  
  38.   
  39.   return fread(ptr, size, nmemb, stream);  
  40.   
  41. }  
  42.   
  43. //这个函数是为了符合CURLOPT_PROGRESSFUNCTION而构造的  
  44.   
  45. //显示文件传输进度,t代表文件大小,d代表传输已经完成部分  
  46.   
  47. int my_progress_func(GtkWidget *bar,  
  48.   
  49.                      double t, /* dltotal */  
  50.   
  51.                      double d, /* dlnow */  
  52.   
  53.                      double ultotal,  
  54.   
  55.                      double ulnow)  
  56.   
  57. {  
  58.   
  59. /*  printf("%d / %d (%g %%)/n", d, t, d*100.0/t);*/  
  60.   
  61.   gdk_threads_enter();  
  62.   
  63.   gtk_progress_set_value(GTK_PROGRESS(bar), d*100.0/t);  
  64.   
  65.   gdk_threads_leave();  
  66.   
  67.   return 0;  
  68.   
  69. }  
  70.   
  71.    
  72.   
  73. void *my_thread(void *ptr)  
  74.   
  75. {  
  76.   
  77.   CURL *curl;  
  78.   
  79.   CURLcode res;  
  80.   
  81.   FILE *outfile;  
  82.   
  83.   gchar *url = ptr;  
  84.   
  85.   curl = curl_easy_init();  
  86.   
  87.   if(curl)  
  88.   
  89.   {  
  90.   
  91.     outfile = fopen("test.curl", "w");  
  92.   
  93.     curl_easy_setopt(curl, CURLOPT_URL, url);  
  94.   
  95.     curl_easy_setopt(curl, CURLOPT_WRITEDATA, outfile);  
  96.   
  97.     curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, my_write_func);  
  98.   
  99.     curl_easy_setopt(curl, CURLOPT_READFUNCTION, my_read_func);  
  100.   
  101.     curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 0L);  
  102.   
  103.     curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, my_progress_func);  
  104.   
  105.     curl_easy_setopt(curl, CURLOPT_PROGRESSDATA, Bar);  
  106.   
  107.     res = curl_easy_perform(curl);  
  108.   
  109.     fclose(outfile);  
  110.   
  111.     /* always cleanup */  
  112.   
  113.     curl_easy_cleanup(curl);  
  114.   
  115.   }  
  116.   
  117.   return NULL;  
  118.   
  119. }  
  120.   
  121. int main(int argc, char **argv)  
  122.   
  123. {  
  124.   
  125.   GtkWidget *Window, *Frame, *Frame2;  
  126.   
  127.   GtkAdjustment *adj;  
  128.   
  129.   /* Must initialize libcurl before any threads are started */  
  130.   
  131.   curl_global_init(CURL_GLOBAL_ALL);  
  132.   
  133.   /* Init thread */  
  134.   
  135.   g_thread_init(NULL);  
  136.   
  137.   gtk_init(&argc, &argv);  
  138.   
  139.   Window = gtk_window_new(GTK_WINDOW_TOPLEVEL);  
  140.   
  141.   Frame = gtk_frame_new(NULL);  
  142.   
  143.   gtk_frame_set_shadow_type(GTK_FRAME(Frame), GTK_SHADOW_OUT);  
  144.   
  145.   gtk_container_add(GTK_CONTAINER(Window), Frame);  
  146.   
  147.   Frame2 = gtk_frame_new(NULL);  
  148.   
  149.   gtk_frame_set_shadow_type(GTK_FRAME(Frame2), GTK_SHADOW_IN);  
  150.   
  151.   gtk_container_add(GTK_CONTAINER(Frame), Frame2);  
  152.   
  153.   gtk_container_set_border_width(GTK_CONTAINER(Frame2), 5);  
  154.   
  155.   adj = (GtkAdjustment*)gtk_adjustment_new(0, 0, 100, 0, 0, 0);  
  156.   
  157.   Bar = gtk_progress_bar_new_with_adjustment(adj);  
  158.   
  159.   gtk_container_add(GTK_CONTAINER(Frame2), Bar);  
  160.   
  161.   gtk_widget_show_all(Window);  
  162.   
  163.   if (!g_thread_create(&my_thread, argv[1], FALSE, NULL) != 0)  
  164.   
  165.     g_warning("can't create the thread");  
  166.   
  167.   gdk_threads_enter();  
  168.   
  169.   gtk_main();  
  170.   
  171.   gdk_threads_leave();  
  172.   
  173.   return 0;  
  174.   
  175. }  

编译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

4、断点续传实例

view plain
  1. //采用CURLOPT_RESUME_FROM_LARGE 实现文件断点续传功能  
  2.   
  3. #include <stdlib.h>  
  4.   
  5. #include <stdio.h>  
  6.   
  7. #include <sys/stat.h>  
  8.   
  9. #include <curl/curl.h>  
  10.   
  11. //这个函数为CURLOPT_HEADERFUNCTION参数构造  
  12.   
  13. /* 从http头部获取文件size*/  
  14.   
  15. size_t getcontentlengthfunc(void *ptr, size_t size, size_t nmemb, void *stream) {  
  16.   
  17.        int r;  
  18.   
  19.        long len = 0;  
  20.   
  21.        /* _snscanf() is Win32 specific */  
  22.   
  23.        // r = _snscanf(ptr, size * nmemb, "Content-Length: %ld/n", &len);  
  24.   
  25.  r = sscanf(ptr, "Content-Length: %ld/n", &len);  
  26.   
  27.        if (r) /* Microsoft: we don't read the specs */  
  28.   
  29.               *((long *) stream) = len;  
  30.   
  31.        return size * nmemb;  
  32.   
  33. }  
  34.   
  35. /* 保存下载文件 */  
  36.   
  37. size_t wirtefunc(void *ptr, size_t size, size_t nmemb, void *stream)  
  38.   
  39. {  
  40.   
  41.         return fwrite(ptr, size, nmemb, stream);  
  42.   
  43. }  
  44.   
  45. /*读取上传文件 */  
  46.   
  47. size_t readfunc(void *ptr, size_t size, size_t nmemb, void *stream)  
  48.   
  49. {  
  50.   
  51.        FILE *f = stream;  
  52.   
  53.        size_t n;  
  54.   
  55.        if (ferror(f))  
  56.   
  57.               return CURL_READFUNC_ABORT;  
  58.   
  59.        n = fread(ptr, size, nmemb, f) * size;  
  60.   
  61.        return n;  
  62.   
  63. }  
  64.   
  65. // 下载 或者上传文件函数  
  66.   
  67. int download(CURL *curlhandle, const char * remotepath, const char * localpath,  
  68.   
  69.            long timeout, long tries)  
  70.   
  71. {  
  72.   
  73.        FILE *f;  
  74.   
  75.        curl_off_t local_file_len = -1 ;  
  76.   
  77.        long filesize =0 ;  
  78.   
  79.        CURLcode r = CURLE_GOT_NOTHING;  
  80.   
  81.        int c;  
  82.   
  83.   struct stat file_info;  
  84.   
  85.   int use_resume = 0;  
  86.   
  87.   /* 得到本地文件大小 */  
  88.   
  89.   //if(access(localpath,F_OK) ==0)  
  90.   
  91.     if(stat(localpath, &file_info) == 0)  
  92.   
  93.      {  
  94.   
  95.         local_file_len =  file_info.st_size;  
  96.   
  97.         use_resume  = 1;  
  98.   
  99.       }  
  100.   
  101.   //采用追加方式打开文件,便于实现文件断点续传工作  
  102.   
  103.        f = fopen(localpath, "ab+");  
  104.   
  105.        if (f == NULL) {  
  106.   
  107.               perror(NULL);  
  108.   
  109.               return 0;  
  110.   
  111.        }  
  112.   
  113.        //curl_easy_setopt(curlhandle, CURLOPT_UPLOAD, 1L);  
  114.   
  115.        curl_easy_setopt(curlhandle, CURLOPT_URL, remotepath);  
  116.   
  117.               curl_easy_setopt(curlhandle, CURLOPT_CONNECTTIMEOUT, timeout);  // 设置连接超时,单位秒  
  118.   
  119.        //设置http 头部处理函数  
  120.   
  121.        curl_easy_setopt(curlhandle, CURLOPT_HEADERFUNCTION, getcontentlengthfunc);  
  122.   
  123.        curl_easy_setopt(curlhandle, CURLOPT_HEADERDATA, &filesize);  
  124.   
  125.  // 设置文件续传的位置给libcurl  
  126.   
  127.        curl_easy_setopt(curlhandle, CURLOPT_RESUME_FROM_LARGE, use_resume?local_file_len:0);  
  128.   
  129.        curl_easy_setopt(curlhandle, CURLOPT_WRITEDATA, f);  
  130.   
  131.        curl_easy_setopt(curlhandle, CURLOPT_WRITEFUNCTION, wirtefunc);  
  132.   
  133.        //curl_easy_setopt(curlhandle, CURLOPT_READFUNCTION, readfunc);  
  134.   
  135.        //curl_easy_setopt(curlhandle, CURLOPT_READDATA, f);  
  136.   
  137.        curl_easy_setopt(curlhandle, CURLOPT_NOPROGRESS, 1L);  
  138.   
  139.        curl_easy_setopt(curlhandle, CURLOPT_VERBOSE, 1L);  
  140.   
  141.          r = curl_easy_perform(curlhandle);  
  142.   
  143.        fclose(f);  
  144.   
  145.        if (r == CURLE_OK)  
  146.   
  147.               return 1;  
  148.   
  149.        else {  
  150.   
  151.               fprintf(stderr, "%s/n", curl_easy_strerror(r));  
  152.   
  153.               return 0;  
  154.   
  155.        }  
  156.   
  157. }  
  158.   
  159. int main(int c, char **argv) {  
  160.   
  161.        CURL *curlhandle = NULL;  
  162.   
  163.        curl_global_init(CURL_GLOBAL_ALL);  
  164.   
  165.        curlhandle = curl_easy_init();  
  166.   
  167.        //download(curlhandle, "ftp://user:pass@host/path/file", "C://file", 0, 3);  
  168.   
  169.   download(curlhandle , "http://software.sky-union.cn/index.asp","/work/index.asp",1,3);  
  170.   
  171.        curl_easy_cleanup(curlhandle);  
  172.   
  173.        curl_global_cleanup();  
  174.   
  175.        return 0;  
  176.   
  177. }  

编译gcc  resume.c  -o resume –lcurl

./ resume

 


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/445221.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大数据学习(09)--Hadoop2.0介绍

文章目录目录1.Hadoop的发展与优化1.1 Hadoop1.0 的不足与局限1.2 Hadoop2.0 的改进与提升2.HDFS2.0 的新特性2.1 HDFS HA2.2 HDFS Federation3. 新一代的资源管理器YARN3.1 MapReduce1.0 缺陷3.2 YARN的设计思路3.3 YARN 体系结构3.4 YARN工作流程3.5 YARN框架与MapReduce1.0框…

Java多线程常用方法

start()与run() start() 启动线程并执行相应的run()方法 run() 子线程要执行的代码放入run()方法 getName()和setName() getName() 获取此线程的名字 setName() 设置此线程的名字 isAlive() 是判断当前线程是否处于活动状态。活动状态就是已经启动尚未终止。 curren…

MachineLearning(2)-图像分类常用数据集

图像分类常用数据集1 CIFAR-102.MNIST3.STL_104.Imagenet5.L-Sun6.caltech-101在训练神经网络进行图像识别分类时&#xff0c;常会用到一些通用的数据集合。利用这些数据集合可以对比不同模型的性能差异。下文整理常用的图片数据集合&#xff08;持续更新中)。基本信息对比表格…

Linux网络编程实例详解

本文介绍了在Linux环境下的socket编程常用函数用法及socket编程的一般规则和客户/服务器模型的编程应注意的事项和常遇问题的解决方法&#xff0c;并举了具体代 码实例。要理解本文所谈的技术问题需要读者具有一定C语言的编程经验和TCP/IP方面的基本知识。要实习本文的示例&…

python的命令解析getopt.getopt()函数分析

【转自http://hi.baidu.com/javalang/blog/category/Python】 可以参考http://docs.python.org/lib/module-getopt.html # -*- coding: cp936 -*-import getoptimport sysdef usage():print Help Information:-h: Show help information-xValue:...if __name____main__:#set d…

博弈论基础

博弈论总结 什么是博弈论&#xff1a; 多人进行博弈&#xff0c;假设每个人都采取最优策略&#xff0c;一定有一个人胜出&#xff0c;在知道初态及规则的情况下&#xff0c;求解出 何人胜出的一类问题的理论及方法。 博弈论的一些性质 P点&#xff1a;必败点&#xff0c;N…

矩阵论-范数理论及其应用

范数理论及其应用2.1向量范数及其性质2.2矩阵范数本系列博文主要总结学习矩阵论的心得笔记&#xff0c;参考数目《矩阵论》–张凯院&#xff1b;整个文章的整理体系参照行书过程。范数–非负实数&#xff0c;用于衡量线性空间元素&#xff08;如&#xff1a;向量&#xff0c;矩…

大数据学习(09)--spark学习

文章目录目录1.spark介绍1.1 spark介绍1.2 scale介绍1.3 spark和Hadoop比较2.spark生态系统3.spark运行框架3.1 基本概念3.2 架构的设计3.3 spark运行基本流程3.4 spark运行原理3.5 RDD运行原理3.5.1 设计背景3.5.2 RDD概念和特性3.5.3 RDD之间的依赖关系3.5.4 stage的划分3.5.…

探索 Pexpect

概述 通过本系列第一部分 《探索 Pexpect&#xff0c;第 1 部分&#xff1a;剖析 Pexpect 》&#xff08;请参阅参考资料&#xff09;的介绍&#xff0c;相信大家已经对 Pexpect 的用法已经有了比较全面的了解&#xff0c;知道 Pexpect 是个纯 Python 语言实现的模块&#xff…

Python的Pexpect详解 [图片]

Pexpect 是一个用来启动子程序并对其进行自动控制的纯 Python 模块。 Pexpect 可以用来和像 ssh、ftp、passwd、telnet 等命令行程序进行自动交互。继第一部分《探索 Pexpect&#xff0c;第 1 部分&#xff1a;剖析 Pexpect 》介绍了 Pexpect 的基础和如何使用后&#xff0c;本…

关系数据库——sql增删改

数据的插入 插入元祖 --1. 表名后没有指定属性列&#xff1a;表示要插入的是一条完整的元组&#xff0c;且属性列属性与表定义中的顺序一致 insert into student values (201215128, 陈东, 18, 男, IS);--2. 在表明后指定要插入数据的表名及属性列&#xff0c;属性列的顺序可…

机器学习中的聚类方法总结

聚类定义 定义 聚类就是对大量未知标注 的数据集&#xff0c;按数据 的内在相似性将数据集划分为多个类别&#xff0c;使 类别内的数据相似度较大而类别间的数据相 似度较小。是无监督的分类方式。 聚类思想 给定一个有N个对象的数据集&#xff0c;构造数据的k 个簇&#x…

学点数学(1)-随机变量函数变换

随机变量函数变换本文介绍一维随机变量函数变换&#xff0c;参考文献&#xff1a;https://wenku.baidu.com/view/619f74ac3186bceb19e8bbd0.html变换TTT作用于随机变量XXX&#xff0c;产生随机变量YYY. T:X−>Y或者写为yT(x)T:X->Y 或者写为 yT(x)T:X−>Y或者写为yT(x…

关系数据库——关系数据语言

关系 域&#xff1a;一组具有相同数据类型的值的集合&#xff08;即取值范围&#xff09; 笛卡尔积&#xff1a;域上的一种集合运算。结果为一个集合&#xff0c;集合的每一个元素是一个元组&#xff0c;元组的每一个分量来自不同的域。 基数&#xff1a;一个域允许的不同取值…

Python模块(2)-Numpy 简易使用教程

Numpy模块 简易使用教程1.数组创建2.数组基本属性-维度、尺寸、数据类型3.数组访问-索引、切片、迭代4.数组的算术运算-加减乘除、转置求逆、极大极小5.通用函数-sin,cos,exp,sqrtnp.dot与np.matmul的区别6.数组的合并和分割6.1 np.vstack(),np.hstack()6.2 np.stack()7.list与…

机器学习问题总结(01)

文章目录1.请描述推荐系统中协同过滤算法CF的原理2.请描述决策树的原理、过程、终止条件&#xff0c;以及如何防止过拟合2.1决策树生成算法2.2 剪枝处理&#xff08;防止过拟合&#xff09;2.3 停止条件2.4 棵决策树的生成过程2.5 决策树的损失函数3.请描述K-means的原理&#…

pthread_attr_init线程属性

1&#xff0e;线程属性 线程具有属性&#xff0c;用pthread_attr_t表示&#xff0c;在对该结构进行处理之前必须进行初始化&#xff0c;在使用后需要对其去除初始化。我们用pthread_attr_init函数对其初始化&#xff0c;用pthread_attr_destroy对其去除初始化。 1&#xff0e; …

Python实例讲解 -- 解析xml

Xml代码 <?xml version"1.0" encoding"utf-8"?> <info> <intro>信息</intro> <list id001> <head>auto_userone</head> <name>Jordy</name> <number&g…

springboot3——Email

maven导入包&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId><version>2.1.6.RELEASE</version></dependency> 参数配置&#xff1a; # MailPrope…

python(22)--面向对象1-封装

python面向对象1面向过程/面向对象2面向对象核心概念-类3类的设计3.1类三要素-类名、属性、方法3.2面向对象基础语法3.2.1查看对象的常用方法3.2.2类定义3.2.3创建类对象3.2.4__init__()方法3.2.5 self参数3.2.6类内置方法和属性_del_()方法--销毁对象_str_()方法--定制化输出对…