C++跨平台开源库POCO学习笔记

原文链接:http://grow.sinaapp.com/?p=1271

POCO(pocoproject.org)看起来是很不错的C++跨平台开源库,包含网络(HTTP、FTP等)、正则、XML、Zip、日期、文件、线程、通知、配置、日志、Timer等方面的类,只可惜国内使用者和讨论很少。

一、编译安装方法

  1. 从官网(pocoproject.org/download)下载POCO源代码,推荐下载基本版本(Basic Edition)
  2. POCO由基础(Foundation)、有用工具(Util)、网络(Net)、XML等几大模块组成,源代码中每个模块为一个单独的目录,包含本模块的include文件、源代码(src)、例子(samples)和测试样本(testsuite)。
  3. windows平台下推荐通过VS命令工具进行编译,具体操作为从开始–打开VS命令工具–进入poco源代码目录–输入buildwin查看具体用法。可选择生成3种不同的库(static_mt|static_md|shared|all),还可选择生成release或debug版本,推荐生成release的static_mt版本,这样生成的程序可以直接发布。具体说明可参加官方文档中的说明(pocoproject.org/docs)。生成的库文件在源代码目录下的lib文件夹中
  4. 可将各个不同模块下的include目录放在一起方便随后程序使用,像我这样

二、如何使用呢–以免费的Visual C++ 2010 Express版本为例

  1. 首先新建一个项目,添加一个C++源文件,点击Visual C++菜单栏的项目-属性打开属性页,点击 配置属性-C/C++-常规 在右边的附件包含目录里填入Poco的include文件所在目录。点击 配置属性-链接器-常规 在右边的附加库目录里填入Poco lib库或dll库所在的目录
  2. 默认情况下Poco可自动链接生成的dll库,如果想让它自动链接静态lib库,请点击 配置属性-C/C++-预处理器 在右边的预处理器定义中添加 POCO_STATIC。进一步了解请参考官方文档。
  3. Poco使用了C++的命名空间和异常机制,请记得处理异常哦,否则程序可能会崩溃的。Poco::Exception是所有Poco异常类的基类,如果你不知道具体的异常类型,可使用下面的方式捕获所有异常信息:
    try
    {
    	std::vector<std::string> dirs;
    	getDirList(dirs);
     
    	for(size_t i=0; i<dirs.size(); i++)
    	{
    		std::cout<<"deal dir "<<dirs[i]<<"....\n";
    		pocoFtp1(dirs[i]);
    	}
    }
    catch(Poco::Exception &exc)
    {
    	std::cout<<"exc"<<exc.displayText();
    }

三、利用POCO进行HTTP POST请求的例子

#include<iostream>
#include "Poco/Net/HTMLForm.h"
#include "Poco/URI.h"
#include "Poco/Net/HTTPClientSession.h"
#include "Poco/Net/HTTPRequest.h"
#include "Poco/Net/HTTPResponse.h"
#include "Poco/StreamCopier.h"
#include "Poco/Net/NetException.h"
 
//可用下面数据测试
//url http://current.sinaapp.com/post.php
//key abc
//value 456
 
//向网页提交post请求
void pocoPost(const std::string &url, const std::string &key, const std::string &value)
{
	Poco::URI purl(url);
 
	try
	{
		Poco::Net::HTTPClientSession session( purl.getHost(), purl.getPort() );
//如需设置代理 将下面一句注释去掉		
//session.setProxy("172.18.172.251",80);
 
		Poco::Net::HTTPRequest req(Poco::Net::HTTPRequest::HTTP_POST, purl.getPath(), Poco::Net::HTTPMessage::HTTP_1_1);
 
		Poco::Net::HTMLForm form;
		form.add(key, value);
 
		// Send the request.
		form.prepareSubmit(req);
		std::ostream& ostr = session.sendRequest(req);
		form.write(ostr);//提交post的键值信息
 
		Poco::Net::HTTPResponse res;
 
		std::istream& istr = session.receiveResponse(res);
//上句接收网站回应的信息 返回输入流 并copy到标准控制台输出流
		Poco::StreamCopier::copyStream(istr, std::cout);
		std::cout<<std::endl;
	}
	catch(Poco::Net::NetException& ex)
	{
		std::cout<<"post wrong: "<<ex.displayText();
	}
}

四、利用POCO操作FTP的例子

#include "Poco/Net/FTPClientSession.h"
#include "Poco/StreamCopier.h"
 
#include <iostream>
#include <vector>
#include <sstream>
 
void pocoFtp(const std::string &host,const std::string &username,const std::string &password,const std::string &dir)
{
	Poco::Net::FTPClientSession session(host);
	session.login(username, password);//登录
 
	session.setWorkingDirectory(dir);//设置读取目录
	std::istream &ftpin = session.beginList("");//下载目录中文件列表
 
	std::string str;
	std::vector<std::string > filelist;
	while(ftpin>>str)
	{//存储文件列表
		filelist.push_back(str);
	}
	session.endList();//关闭目录下载连接
 
	for(size_t i=0; i!=filelist.size(); i++)
	{
		std::cout<<"deal file "<<filelist[i]<<"...\n";
		std::string content;
//下载每个文件并存储到字符串content中
		Poco::StreamCopier::copyToString( session.beginDownload( filelist[i] ), content);
		session.endDownload();//关闭下载连接
	}
 
	session.close();//断开FTP
}

五、利用POCO读写XML配置文件的例子

#include "Poco/Util/XMLConfiguration.h"
#include <string>
#include <iostream>
 
void pocoConfig()
{
	using Poco::AutoPtr;
	using Poco::Util::XMLConfiguration;
 
	AutoPtr<XMLConfiguration> pConf(new XMLConfiguration("config1.xml") );
 
	pConf->setDouble("prop6",3.14);
	double a = pConf->getDouble("prop2");
	std::cout<<a;
	pConf->save("config1.xml");
}
xml配置文件格式如下

<config>
	<prop2>2.3</prop2>
</config>
相关资源:
1. POCO官方幻灯片教程整理
2. POCO官方文档说明

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值