简要说明:C++使用libcurl訪问"www.baidu.com"。获取返回码和打印出http文件

/*
* @ libcurl使用演示样例
* @ 2014.04.29
* @ g++ -o LibCurlFunc LibCurlFunc.cpp -lcurl
*/
#include <iostream>
#include <string.h>
#include <curl/curl.h>
using namespace std; /*
Http请求结束的回调函数
@ 会被调用多次,有下载到数据(http文件)就回调。直到下载完
*/
static size_t WriteFunction(void *input, size_t uSize, size_t uCount, void *avg)
{
/* cout << "[WriteFunction]:" << endl
<< "input=" << (char*)input << endl
<< "elementSize=" << uSize << endl
<< "elementCount=" << uCount << endl;*/ // 将请求返回数据input复制到avg中(avg为一開始curl_easy_setopt设置的參)
size_t uLen = uSize*uCount;
// string &sBuffer = *reinterpret_cast<string *>(avg);
// sBuffer.append(reinterpret_cast<const char *>(input), uLen);
string *pStr = (string *)(avg);
pStr->append((char *)(input), uLen); // 仅仅有返回uSize*uCount才会返回成功
return uLen;
} int main()
{
CURL *pCurl = NULL;
CURLcode code; /* CURLcode curl_global_init(long flags)
@ 初始化libcurl。全局仅仅需调一次
@ flags: CURL_GLOBAL_DEFAULT // 等同于CURL_GLOBAL_ALL
CURL_GLOBAL_ALL // 初始化全部的可能的调用
CURL_GLOBAL_SSL // 初始化支持安全套接字层
CURL_GLOBAL_WIN32 // 初始化win32套接字库
CURL_GLOBAL_NOTHING // 没有额外的初始化
......
*/
code = curl_global_init(CURL_GLOBAL_DEFAULT);
if (code != CURLE_OK) {
cout << "curl_global_init() Err" << endl;
return -1;
} /* CURL *curl_easy_init()
@ 初始化curl生成CURL *curl指针
*/
pCurl = curl_easy_init();
if (pCurl == NULL) {
cout << "curl_easy_init() Err" << endl;
return -1;
} string sUrl = "www.baidu.com";
curl_slist *pHeaders = NULL;
string sBuffer; /* struct curl_slist *curl_slist_append(struct curl_slist * list, const char * string);
@ 加入Http消息头
@ 属性string:形式为name+": "+contents
*/
string header = "username: andyawang";
pHeaders = curl_slist_append(pHeaders, header.c_str()); /* CURLcode curl_easy_setopt(CURL *handle, CURLoption option, parameter);
@ 设置下载属性及经常使用參数
*/
curl_easy_setopt(pCurl, CURLOPT_URL, "www.baidu.com"); // 訪问的URL
curl_easy_setopt(pCurl, CURLOPT_HTTPHEADER, pHeaders); // 属性头部(要不pHeader就没用了)
curl_easy_setopt(pCurl, CURLOPT_TIMEOUT, 20); // 超时(单位S)
curl_easy_setopt(pCurl, CURLOPT_HEADER, 1); // 下载数据包含HTTP头部 curl_easy_setopt(pCurl, CURLOPT_WRITEFUNCTION, &WriteFunction); // !数据回调函数
curl_easy_setopt(pCurl, CURLOPT_WRITEDATA, &sBuffer); // !数据回调函数的參。一般为Buffer或文件fd /* CURLcode curl_easy_perform(CURL *handle);
@ 開始下载
*/
code = curl_easy_perform(pCurl);
if (code != CURLE_OK) {
cout << "curl_easy_perform() Err" << endl;
return -1;
} /* CURLcode curl_easy_getinfo(CURL *curl, CURLINFO info, ... );
@ 获取下载完的相关信息
@ info:CURLINFO_RESPONSE_CODE // 获取返回的Http码
CURLINFO_TOTAL_TIME // 获取总的请求下载时间
CURLINFO_SIZE_DOWNLOAD // 获取下载的文件大小
......
*/
long retCode = 0;
code = curl_easy_getinfo(pCurl, CURLINFO_RESPONSE_CODE , &retCode);
if (code != CURLE_OK) {
cout << "curl_easy_perform() Err" << endl;
return -1;
}
cout << "[Http Return Code] : " << retCode << endl;
cout << "[Http Context] : " << endl << sBuffer << endl; /* void curl_easy_cleanup(CURL * handle);
@ 释放CURL *curl指针
*/
curl_easy_cleanup(pCurl); /* void curl_global_cleanup(void);
@ 初始化libcurl,全局也仅仅需调一次
*/
curl_global_cleanup();
}

执行结果:

gapp_devnet_1:/data/home/andyawang/code/Components/Http # g++ -o LibCurlFunc LibCurlFunc.cpp -lcurl
gapp_devnet_1:/data/home/andyawang/code/Components/Http # ./LibCurlFunc
[Http Return Code] : 200
[Http Context] :
HTTP/1.0 200 OK
Date: Wed, 30 Apr 2014 02:41:35 GMT
Content-Type: text/html; charset=utf-8
Vary: Accept-Encoding
Set-Cookie: BAIDUID=8DD8F93E631536AD6CDC010E1A52507C:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: BDSVRTM=0; path=/
Set-Cookie: H_PS_PSSID=5695_1428_5225_6024_4760_6018_6256_6311_6269; path=/; domain=.baidu.com
P3P: CP=" OTI DSP COR IVA OUR IND COM "
Cache-Control: private
Expires: Wed, 30 Apr 2014 02:41:33 GMT
X-Powered-By: HPHP
Server: BWS/1.1
BDPAGETYPE: 1
BDQID: 0x9fcc512a0001374f
BDUSERID: 0
X-Cache: MISS from qplus_wanproxy_pub_fy1
Via: 1.0 qplus_wanproxy_pub_fy1 (squid/3.1.18)
Connection: close <!DOCTYPE html><!--STATUS OK--><html><head><meta http-equiv="content-type" content="text/html;charset=utf-8"><link rel="dns-prefetch" href="//s1.bdstatic.com"/><link rel="dns-prefetch" href="//t1.baidu.com"/><link rel="dns-prefetch" href="//t2.baidu.com"/><link rel="dns-prefetch" href="//t3.baidu.com"/><link rel="dns-prefetch" href="//t10.baidu.com"/><link rel="dns-prefetch" href="//t11.baidu.com"/><link rel="dns-prefetch" href="//t12.baidu.com"/><title>百度一下。你就知道</title><style >html,body{height:100%}html{overflow-y:auto}#wrapper{position:relative;_position:;min-height:100%}#content{padding-bottom:100px;text-align:center}#ftCon{height:100px;position:absolute;bottom:44px;text-align:center;width:100%;margin:0 auto;
......

libcurl使用演示样例的更多相关文章

  1. Libcurl的编译_HTTP/HTTPSclient源代码演示样例

    HTTP/HTTPSclient源代码演示样例 环境:  zlib-1.2.8  openssl-1.0.1g  curl-7.36 Author:  Kagula LastUpdateDate: 2 ...

  2. JDBC连接MySQL数据库及演示样例

    JDBC是Sun公司制定的一个能够用Java语言连接数据库的技术. 一.JDBC基础知识         JDBC(Java Data Base Connectivity,java数据库连接)是一种用 ...

  3. java 覆盖hashCode()深入探讨 代码演示样例

    java 翻盖hashCode()深入探讨 代码演示样例 package org.rui.collection2.hashcode; /** * 覆盖hashcode * 设计HashCode时最重要 ...

  4. 模式识别 - 处理多演示样例学习(MIL)特征(matlab)

    处理多演示样例学习(MIL)特征(matlab) 本文地址: http://blog.csdn.net/caroline_wendy/article/details/27206325 多演示样例学习( ...

  5. java并行调度框架封装及演示样例

    參考资料:  阿里巴巴开源项目 CobarClient  源代码实现. 分享作者:闫建忠 分享时间:2014年5月7日 ---------------------------------------- ...

  6. Java连接redis的使用演示样例

    Java连接redis的使用演示样例 Redis是开源的key-value存储工具,redis通经常使用来存储结构化的数据,由于redis的key能够包括String.hash.listset和sor ...

  7. Introspector(内省)简单演示样例 与 简单应用

    简单演示样例: package com.asdfLeftHand.test; import java.beans.BeanDescriptor; import java.beans.BeanInfo; ...

  8. 构造Scala开发环境并创建ApiDemos演示样例项目

    从2011年開始写Android ApiDemos 以来.Android的版本号也更新了非常多,眼下的版本号已经是4.04. ApiDemos中的样例也添加了不少,有必要更新Android ApiDe ...

  9. OpenCV LDA(Linnear Discriminant analysis)类的使用---OpenCV LDA演示样例

    1.OpenCV中LDA类的声明 //contrib.hpp class CV_EXPORTS LDA { public: // Initializes a LDA with num_componen ...

随机推荐

  1. JS判断浏览器类型以及版本号

    <script type="text/javascript">        (function(){            window.nav={};       ...

  2. DEDECMS 猜你喜欢

      dede升级了5.7后,有个地方要求调用相关文章,于是写下  dede:likeart  标签却无法实现关联,显示的则是所有文章. 发现原来从5.5版开始已经替换了该标签,把模板中 likeart ...

  3. 利用Anaconda安装python后,如何安装opencv-python

    利用Anaconda安装python后,想要安装opencv-python,但发现利用opencv-python的官方教程,没法实现opencv的安装 还好看到了另外一篇博客的方法,试一下,果然凑效 ...

  4. Coursera《machine learning》--(8)神经网络表述

    本笔记为Coursera在线课程<Machine Learning>中的神经网络章节的笔记. 八.神经网络:表述(Neural Networks: Representation) 本节主要 ...

  5. 使用SeaJS实现模块化JavaScript开发

    前言 SeaJS是一个遵循CommonJS规范的JavaScript模块加载框架,可以实现JavaScript的模块化开发及加载机制.与jQuery等JavaScript框架不同,SeaJS不会扩展封 ...

  6. [Codeforces Round #296 div2 D] Clique Problem 【线段树+DP】

    题目链接:CF - R296 - d2 - D 题目大意 一个特殊的图,一些数轴上的点,每个点有一个坐标 X,有一个权值 W,两点 (i, j) 之间有边当且仅当 |Xi - Xj| >= Wi ...

  7. web sql Database

    http://www.ibm.com/developerworks/cn/web/1108_zhaifeng_websqldb/ http://baishanheishui.iteye.com/blo ...

  8. 减少 WAF 漏报的 8 种方法 !

    近十年来,WAF 已经逐渐发展成熟,被软件行业接受并成为无数企业保护应用的不二选择.很多大型企业甚至相继亲自设计或通过并购涉足其中,在这个硕大的市场里逐鹿竞争,同时也推动了应用层防火墙的技术演进. 与 ...

  9. iOS图案锁,支持动画、图片、绘图

    最近忙着搭建一个聊天用的框架,过几天应该会整理写出来吧,原理不难,但是实现后会省很多事.好久没写博客,周末心血来潮写了个图案锁,这东西没什么技术含量,网上一堆,这次这个图案锁顺便联系了怎么打包使用.a ...

  10. Android Wear 开发入门

    大家好,我是陆嘉杰,我是一名Android开发者.我想和大家进行一些技术交流,希望越来越多的人能和我成为好朋友. 大家都知道,智能手表是下一个开发的风口,而这方面的技术又属于前沿,所以和大家分享下An ...