Chinaunix首页 | 论坛 | 博客
  • 博客访问: 853624
  • 博文数量: 286
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1980
  • 用 户 组: 普通用户
  • 注册时间: 2014-05-04 16:41
文章分类

全部博文(286)

文章存档

2020年(2)

2018年(5)

2017年(95)

2016年(69)

2015年(15)

2014年(100)

我的朋友

分类: Web开发

2017-04-28 13:47:54

libcurl是免费的轻量级的客户端网络库,支持DICT, FILE, FTP, FTPS, Gopher, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS,POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, Telnet, TFTP.支持SSL, HTTPPOST,HTTPPUT, FTP上传, HTTP form上传,代理,cookies, 用户名与密码认证。

系统环境:Ubuntu 14.04.3 LTS
源码:curl-7.49.0.tar.gz (https://curl.haxx.se/download.html)
交叉编译环境:arm-none-linux-gnueabi-

[zhaojq@virtual-machine]# tar -zxvf curl-7.49.0.tar.gz
[zhaojq@virtual-machine]# cd curl-7.49.0/
[zhaojq@virtual-machine]# ./configure --prefix=/home/zhaojq/libcurl --host=arm-none-linux CC=arm-none-linux-gnueabi-gcc CXX=arm-none-linux-gnueabi-g++
[zhaojq@virtual-machine]# make
[zhaojq@virtual-machine]# make install
生成成功

交叉编译后的文件在/home/zhaojq/libcurl目录下
[zhaojq@virtual-machine libcurl]# ls
bin  include  lib  share

libcurl头文件在include/curl目录
[zhaojq@virtual-machine libcurl/include/curl]# ls
curlbuild.h  curl.h  curlrules.h  curlver.h  easy.h  mprintf.h  multi.h  stdcheaders.h  typecheck-gcc.h

交叉编译后的动态库文件在lib目录
[zhaojq@virtual-machine libcurl/lib]# ls
libcurl.a  libcurl.la  libcurl.so  libcurl.so.4  libcurl.so.4.4.0  pkgconfig

编译test实例
https://curl.haxx.se/libcurl/c/example.html
post-callback An example source code that issues a HTTP POST and we provide the actual data through a read callback.

[zhaojq@virtual-machine]# vim libcurl_test.cpp
[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. #include   
  2. #include   
  3. #include   
  4.    
  5. const char data[]="this is what we post to the silly web server";  
  6.    
  7. struct WriteThis {  
  8.   const char *readptr;  
  9.   long sizeleft;  
  10. };  
  11.    
  12. static size_t read_callback(void *ptr, size_t size, size_t nmemb, void *userp)  
  13. {  
  14.   struct WriteThis *pooh = (struct WriteThis *)userp;  
  15.    
  16.   if(size*nmemb < 1)  
  17.     return 0;  
  18.    
  19.   if(pooh->sizeleft) {  
  20.     *(char *)ptr = pooh->readptr[0]; /* copy one single byte */   
  21.     pooh->readptr++;                 /* advance pointer */   
  22.     pooh->sizeleft--;                /* less data left */   
  23.     return 1;                        /* we return 1 byte at a time! */   
  24.   }  
  25.    
  26.   return 0;                          /* no more data left to deliver */   
  27. }  
  28.    
  29. int main(void)  
  30. {  
  31.   CURL *curl;  
  32.   CURLcode res;  
  33.    
  34.   struct WriteThis pooh;  
  35.    
  36.   pooh.readptr = data;  
  37.   pooh.sizeleft = (long)strlen(data);  
  38.    
  39.   /* In windows, this will init the winsock stuff */   
  40.   res = curl_global_init(CURL_GLOBAL_DEFAULT);  
  41.   /* Check for errors */   
  42.   if(res != CURLE_OK) {  
  43.     fprintf(stderr, "curl_global_init() failed: %s\n",  
  44.             curl_easy_strerror(res));  
  45.     return 1;  
  46.   }  
  47.    
  48.   /* get a curl handle */   
  49.   curl = curl_easy_init();  
  50.   if(curl) {  
  51.     /* First set the URL that is about to receive our POST. */   
  52.     curl_easy_setopt(curl, CURLOPT_URL, "");  
  53.    
  54.     /* Now specify we want to POST data */   
  55.     curl_easy_setopt(curl, CURLOPT_POST, 1L);  
  56.    
  57.     /* we want to use our own read function */   
  58.     curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback);  
  59.    
  60.     /* pointer to pass to our read function */   
  61.     curl_easy_setopt(curl, CURLOPT_READDATA, &pooh);  
  62.    
  63.     /* get verbose debug output please */   
  64.     curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);  
  65.    
  66.     /* 
  67.       If you use POST to a HTTP 1.1 server, you can send data without knowing 
  68.       the size before starting the POST if you use chunked encoding. You 
  69.       enable this by adding a header like "Transfer-Encoding: chunked" with 
  70.       CURLOPT_HTTPHEADER. With HTTP 1.0 or without chunked transfer, you must 
  71.       specify the size in the request. 
  72.     */   
  73. #ifdef USE_CHUNKED  
  74.     {  
  75.       struct curl_slist *chunk = NULL;  
  76.    
  77.       chunk = curl_slist_append(chunk, "Transfer-Encoding: chunked");  
  78.       res = curl_easy_setopt(curl, CURLOPT_HTTPHEADER, chunk);  
  79.       /* use curl_slist_free_all() after the *perform() call to free this 
  80.          list again */   
  81.     }  
  82. #else  
  83.     /* Set the expected POST size. If you want to POST large amounts of data, 
  84.        consider CURLOPT_POSTFIELDSIZE_LARGE */   
  85.     curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, pooh.sizeleft);  
  86. #endif  
  87.    
  88. #ifdef DISABLE_EXPECT  
  89.     /* 
  90.       Using POST with HTTP 1.1 implies the use of a "Expect: 100-continue" 
  91.       header.  You can disable this header with CURLOPT_HTTPHEADER as usual. 
  92.       NOTE: if you want chunked transfer too, you need to combine these two 
  93.       since you can only set one list of headers with CURLOPT_HTTPHEADER. */   
  94.    
  95.     /* A less good option would be to enforce HTTP 1.0, but that might also 
  96.        have other implications. */   
  97.     {  
  98.       struct curl_slist *chunk = NULL;  
  99.    
  100.       chunk = curl_slist_append(chunk, "Expect:");  
  101.       res = curl_easy_setopt(curl, CURLOPT_HTTPHEADER, chunk);  
  102.       /* use curl_slist_free_all() after the *perform() call to free this 
  103.          list again */   
  104.     }  
  105. #endif  
  106.    
  107.     /* Perform the request, res will get the return code */   
  108.     res = curl_easy_perform(curl);  
  109.     /* Check for errors */   
  110.     if(res != CURLE_OK)  
  111.       fprintf(stderr, "curl_easy_perform() failed: %s\n",  
  112.               curl_easy_strerror(res));  
  113.    
  114.     /* always cleanup */   
  115.     curl_easy_cleanup(curl);  
  116.   }  
  117.   curl_global_cleanup();  
  118.   return 0;  
  119. }  

[zhaojq@virtual-machine]# arm-none-linux-gnueabi-g++ -lcurl -I/home/kt/libcurl/include -L/home/kt/libcurl/lib -o libcurl_test libcurl.cpp
编译通过,在当前目录生成libcurl_test可执行文件

/home/zhaojq/libcurl目录下的所有文件和pkgconfig目录都拷贝到ARM设备上文件系统的/lib目录,
libcurl_test拷贝到ARM设备上

执行./libcurl_test
./libcurl_test: error while loading shared libraries: libssl.so.1.0.0: cannot open shared object file: No such file or directory

libcurl运行需要libssl.so.1.0.0的库,ARM移植openssl-1.0.0s.tar.gz详见另一篇文章
http://blog.csdn.net/miaodichiyou/article/details/50385049



移植成功再次执行./libcurl_test
[root@ARM /]# ./libcurl_test 
*   Trying 93.184.216.34...
* Connected to example.com (93.184.216.34) port 80 (#0)
> POST /index.cgi HTTP/1.1
Host: example.com
Accept: */*
Content-Length: 44
Content-Type: application/x-www-form-urlencoded


* We are completely uploaded and fine
< HTTP/1.1 404 Not Found
< Cache-Control: max-age=604800
< Content-Type: text/html
< Date: Thu, 19 May 2016 02:45:50 GMT
< Expires: Thu, 26 May 2016 02:45:50 GMT
< Server: EOS (lax004/2813)
< Content-Length: 460


         "">

       
                404 - Not Found
       
       
               

404 - Not Found


               
       

* Connection #0 to host example.com left intact
移植成功。
阅读(737) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~