1. 程式人生 > >C++跨平臺開源庫POCO學習筆記

C++跨平臺開源庫POCO學習筆記

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官方文件說明