windows平台下 c/c++进行http通信的教训
由于需要使用c++开发一个桌面应用软件,需要用到http请求进行通讯,也是本人第一次进行网络相关的开发工作,遇到了不少坑。
由于是在windows下开发和使用的应用软件,自然而然想到了调用Windows自带的sdk进行开发,开始就使用了winnet这个库,直接调用其AP,当把通讯接口的接口都开发完毕进行集成的时候,才发现winnet这个库是基于MFC框架的,这样子图形界面也需要基于MFC框架进行设计。但是项目中的UI是使用dui进行设计的,这样dui和MFC就出现的冲突,导致开发的通讯接口和UI无法集成。只要推倒重来,使用开源的库来开发通讯接口。
经过调研,发现libcurl这个库功能很齐全、可以满足开发的需求。libcurl的介绍可以到官网查看,有详细的文档和使用示例供学习者学习,比使用winnet的API接口方便多了。
使用libcurl也是简单明了,主要可以分为4个基本:
- 声明并初始化一个CURL句柄:
CURL *curl=curl = curl_easy_init();
- 设置句柄参数,包括URL地址、数据头等:
如设置URL: curl_easy_setopt(handle, CURLOPT_URL, "http://www.csdn.net/");
- 进行数据发送及接受:
- 进行句柄的清理工作,主要是断开链接并清理相关内存资源:
</pre><pre name="code" class="cpp">char*CURL = "www....";
char*sPort = "8080";
CURL*curl_handle;/*声明一个CURL句柄*/
CURLcoderes;/*声明一个状态变量*/ struct MemoryStruct chunk;/*用来存放返回的参数*/
chunk.memory = (char*)malloc(1);
chunk.size = 0; struct curl_slist *headers = NULL;
headers = curl_slist_append(headers,"Content-Type:application/json;charset = UTF-8");/*定义参数的格式为json*/ res = curl_global_init(CURL_GLOBAL_ALL);
if(CURLE_OK != res)
{
return NULL;
} /*initthecurlsession*/
curl_handle = curl_easy_init();
if(NULL = = curl_handle)
{
return NULL;
} curl_easy_reset(curl_handle); /*设置URL地址*/
curl_easy_setopt(curl_handle,CURLOPT_URL,URL); /*设置为GET方法*/
curl_easy_setopt(curl_handle,CURLOPT_HTTPGET,1); /*链接超时时间5秒**/
curl_easy_setopt(curl_handle,CURLOPT_TIMEOUT,5L);
/*设置端口*/
//curl_easy_setopt(curl_handle,CURLOPT_PORT,sPort);
/*包含协议头*/
//curl_easy_setopt(curl_handle,CURLOPT_HEADER,1); /*设置回调函数*/
curl_easy_setopt(curl_handle,CURLOPT_WRITEFUNCTION,WriteMemoryCallback); /*通过回调函数把请求获得的数据写入chunk*/
curl_easy_setopt(curl_handle,CURLOPT_WRITEDATA,(void*)&chunk); curl_easy_setopt(curl_handle,CURLOPT_USERAGENT,"libcurl-agent/1.0"); /*进行请求操作*/
res = curl_easy_perform(curl_handle); /*进行资源释放*/
curl_easy_cleanup(curl_handle);
/*检查是否请求成功*/
if(res != CURLE_OK)
{return NULL;}
return chunk.memory;/*返回获得的参数*/
struct MemoryStruct {
char *memory;
size_t size;
};
static size_t WriteMemoryCallback(void *contents, size_t size, size_t nmemb, void *userp)
{
size_t realsize = size * nmemb;
struct MemoryStruct *mem = (struct MemoryStruct *)userp;
mem->memory = (char*)realloc(mem->memory, mem->size + realsize + 1);
if(mem->memory == NULL) {
/* out of memory! */
LOG("crulHttp.cpp not enough memory (realloc returned NULL)");
return 0;
}
memcpy(&(mem->memory[mem->size]), contents, realsize);
mem->size += realsize;
mem->memory[mem->size] = 0;
return realsize;
}
另外,如果请求的URL中含有中文等字符,则需要对URL进行编码,libcurl也提供了专门的API供大家使用:
char *curlEncode(char*input){
CURL *curl = curl_easy_init();
if(curl) {
char *output = curl_easy_escape(curl, input, 0);
return output;
}
return NULL;
}
windows平台下 c/c++进行http通信的教训的更多相关文章
- [转]Windows平台下Makefile学习笔记
Windows平台下Makefile学习笔记(一) 作者:朱金灿 来源:http://blog.csdn.net/clever101 决心学习Makefile,一方面是为了解决编译开源代码时需要跨编译 ...
- Windows平台下Git服务器搭建
第一步:下载Java,下载地址:http://www.java.com/zh_CN/ 第二步:安装Java.安装步骤不再详述. 第三步:配置Java环境变量. 右键”计算机” => ”属性” = ...
- Windows平台下PHP开发环境的配置
Windows平台下PHP开发环境的配置 一.基本环境 1.Windows XP 32位 2.Apache 2.2.25,下载地址:http://mirror.bit.edu.cn/apache/ht ...
- Mac平台与Windows平台下AndroidStudio增量升级
Android Studio增量升级什么情况下使用最合适呢? 比如现在的as版本是2.2版本,而你的as版本2.0版本,这个时候点Check For Updates就没有反应了,因为你已经2个有版本没 ...
- Windows 平台下Git 服务器搭建
由于项目中一直在使用git作为版本管理,自己对git的理解.使用都还不是怎么的熟悉,所以准备深入了解一下git及一些常用命令的使用,于是干脆把服务端架上,通过自己的PC作为服务端同时作为客户端的角色进 ...
- windows平台下VLC2.0.5编译
windows平台下VLC2.0.5编译说明 时隔一年多,又要搞流媒体了,不过这次是要做流媒体服务器. 暂时决定使用vlc+ffmpeg+live555,虽然听有些前辈说这个组合的性能较差,只能作为学 ...
- 【转】Windows平台下Git服务器搭建
Windows平台下Git服务器搭建 Posted on 2015-05-18 21:29 阿祥当码农 阅读(7637) 评论(0) 编辑 收藏 该文章转自:http://www.codeceo.co ...
- Windows平台下的node.js安装
Windows平台下的node.js安装 直接去nodejs的官网http://nodejs.org/上下载nodejs安装程序,双击安装就可以了 测试安装是否成功: 在命令行输入 node –v 应 ...
- 在Windows平台下Qt的exe报错问题排查步骤
在Windows平台下Qt的exe报错问题排查步骤 工具介绍: 1. Dependency Worker Dependency Worker是一个免费的用具用来扫描任何的32bit 或者64bit 的 ...
随机推荐
- [ZJOI 2014]力
Description 给出n个数qi,给出Fj的定义如下: $$F_j = \sum_{i<j}\frac{q_i q_j}{(i-j)^2 }-\sum_{i>j}\frac{q_i ...
- Go学习——go+channel实战(转)
转载:http://studygolang.com/articles/2423 背景 在最近开发的项目中,后端需要编写许多提供HTTP接口的API,另外技术选型相对宽松,因此选择Golang + Be ...
- Go学习——defer、panic
defer: 延迟到ret之前,通常用于IO的关闭 or 错误处理. 在延迟出现的异常可以被后面的捕捉,但是只有最后一个. defer可以多次,这样形成一个defer栈,后defer的语句在函数返回时 ...
- [WC2008]游览计划
[题目描述] 从未来过绍兴的小 D 有幸参加了Winter Camp 2008,他被这座历史名城的秀丽风景所吸引,强烈要求游览绍兴及其周边的所有景点. 主办者将绍兴划分为 N 行M 列(N×M)个方块 ...
- 【Codeforces Round #435 (Div. 2) A B C D】
CF比赛题目地址:http://codeforces.com/contest/862 A. Mahmoud and Ehab and the MEX ·英文题,述大意: 输入n,x(n,x& ...
- [BZOJ]1079 着色方案(SCOI2008)
相邻色块不同的着色方案,似乎这道题已经见过3个版本了. Description 有n个木块排成一行,从左到右依次编号为1~n.你有k种颜色的油漆,其中第i种颜色的油漆足够涂ci个木块.所有油漆刚好足够 ...
- [bzoj1187][HNOI2007]神奇游乐园
来自FallDream的博客,未经允许,请勿转载,谢谢, 经历了一段艰辛的旅程后,主人公小P乘坐飞艇返回.在返回的途中,小P发现在漫无边际的沙漠中,有一块狭长的绿地特别显眼.往下仔细一看,才发现这是一 ...
- bzoj2839: 集合计数 容斥+组合
2839: 集合计数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 523 Solved: 287[Submit][Status][Discuss] ...
- CentOS7快速配置nginx node mysql8.0
目录: (一)基础准备 (二)安装node (三)安装nginx (四)安装mySql8.0 (五)整体配置 (六)安装PM2守护进程 (一)基础准备1.1 概述 服务器操作系统为 centos7.4 ...
- Maven之自定义archetype生成项目骨架
Maven之自定义archetype生成项目骨架(一) http://blog.csdn.net/sxdtzhaoxinguo/article/details/46895013