curl功能很强大,libcurl就更不用说了。这里笔记下如何最简单的跑通libcurl,复杂的应用场景还是直接查API或者啃源码。
CONTENTS
编译参数
程序使用libcurl就要在编译时链接上,那么编译参数如何写呢?参考【tutorial】。
输入命令curl-config –cflags 来看下cflags如何写:
ubuntu@ubuntu-xenial:~$ curl-config --cflags #本地环境没有安装 The program 'curl-config' can be found in the following packages: * libcurl4-gnutls-dev * libcurl4-nss-dev * libcurl4-openssl-dev Try: sudo apt install <selected package> ubuntu@ubuntu-xenial:~$ sudo apt-get install libcurl4-openssl-dev #安装SSL版本 ubuntu@ubuntu-xenial:~$ curl-config --cflags #cflags 默认不需要设置 ubuntu@ubuntu-xenial:~$ curl-config --libs #libs需要手动指定 -L/usr/lib/x86_64-linux-gnu -lcurl ubuntu@ubuntu-xenial:~$ curl-config --feature #支持SSL SSL 。。。。 。。。。
最简单实例
HelloCstriker1407.c
#include <stdio.h> #include <curl/curl.h> int main(void) { CURL *curl; CURLcode res; curl_global_init(CURL_GLOBAL_DEFAULT); curl = curl_easy_init(); if(curl) { curl_easy_setopt(curl, CURLOPT_URL, "http://116.62.110.235/blog/"); res = curl_easy_perform(curl); curl_easy_cleanup(curl); } curl_global_cleanup(); return 0; }
build && run:
ubuntu@ubuntu-xenial:~/curl_proj$ ubuntu@ubuntu-xenial:~/curl_proj$ gcc HelloCstriker1407.c -o HelloCstriker1407 -L/usr/lib/x86_64-linux-gnu -lcurl ubuntu@ubuntu-xenial:~/curl_proj$ ./HelloCstriker1407 <!DOCTYPE html> <!--[if IE 8]> <html class="ie ie8" lang="zh-CN"> 。。。。。。
这里可以看到,如果libcurl没有指定回调函数,默认会直接输出到控制台,即stdout。这里我们简单的注册一个回调函数。
使用回调函数
HelloCstriker1407.c
#include <stdio.h> #include <string.h> #include <curl/curl.h> #define S_BUFFER_SIZE 20000 static char s_write_buffer[S_BUFFER_SIZE]; size_t s_buffer_write_callback(char *ptr, size_t size, size_t nmemb, void *userdata) { int totalSize = size * nmemb; if(totalSize > S_BUFFER_SIZE) { totalSize = S_BUFFER_SIZE; } memcpy(userdata, ptr, totalSize); printf("Read %d Bytes:%s\n", totalSize, (char *)userdata); return totalSize; } int main(void) { CURL *curl; CURLcode res; curl_global_init(CURL_GLOBAL_DEFAULT); curl = curl_easy_init(); if(curl) { curl_easy_setopt(curl, CURLOPT_URL, "http://116.62.110.235/blog/"); curl_easy_setopt(curl, CURLOPT_WRITEDATA, s_write_buffer); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, s_buffer_write_callback); printf("Begin To Get Website...\n"); memset(s_write_buffer, 0, S_BUFFER_SIZE); curl_easy_perform(curl); printf("Get WebSite Finish...\n"); curl_easy_cleanup(curl); } curl_global_cleanup(); return 0; }
发表评论