POCO C++ Libraies属于功能广泛、轻量级别的开源框架库,它拥有媲美Boost库的功能以及较小的体积广泛应用在物联网平台、工业自动化等领域。
POCO C++ Libraies由多个功能模块组成,其中包括网络、多线程、日志、命令行程序等。POCO官方拥有众多模块的使用示例,可以在短时间内上手并完成相关功能。
官方网址:POCO官方
官方文档:POCO文档
函数用法:POCO函数用法
介绍(引自官方)
PocoNet
HTTP(TCP)服务器启动方式
HTTP(UDP)服务器启动方式
HTTP客户端编写方式
方法调用
DNS域名解析方式
PocoFoundation
Poco 日志(封装后的函数)
Poco 日志用法
Poco 智能指针用法
Poco json相关用法
Poco 获取当前时间
Poco 线程池用法
Poco 互斥锁用法
Poco 智能锁
Poco 智能锁用法
PocoUtil
Poco 控制台程序
Poco 控制台程序启动方式
POCO C++库是开源C++类库的集合,这些库简化并加速了C++中以网络为中心的可移植应用程序的开发。这些库与C++标准库完美集成,并填补了它遗留的许多功能空白。它们的模块化,高效的设计和实现使POCO C++库非常适合嵌入式开发,因为C++编程语言同时适用于底层(设备I / O,中断处理程序等),因此C++编程语言正变得越来越流行。 。)和高级面向对象的开发。当然,POCO也已准备好应对企业级挑战。
POCO由四个核心库和许多附加库组成。核心库是Foundation,XML,Util和Net。附加库中的两个是NetSSL(为Net库中的网络类提供SSL支持)和Data(一个用于统一访问不同SQL数据库的库)。POCO旨在实现以网络为中心的跨平台C++软件开发,而Apple的Cocoa则是用于Mac开发,而Ruby on Rails则是用于Web开发,这是一个功能强大且易于使用的有趣平台,可用于构建您的应用程序。POCO严格使用标准ANSI / ISO C++(包括标准库)构建。贡献者试图在使用高级C++功能与保持类可理解以及代码干净,一致和易于维护之间找到一个良好的平衡。
介绍:
PocoNet属于网络相关框架,集成功能有:
HTTP(TCP)服务器及客户端,HTTP(UDP)服务器以及DNS域名解析等。
PocoNet常用头定义及命名空间:
#include “Poco/Net/SocketAddress.h”
#include “Poco/Net/StreamSocket.h”
#include “Poco/Net/SocketStream.h”
#include “Poco/StreamCopier.h”
#include “Poco/Net/DNS.h”
using Poco::Net::DNS;
using Poco::Net::IPAddress;
using Poco::Net::HostEntry;
使用PocoNet框架需要包含库名:
PocoFoundation
PocoNet
Poco::Net::ServerSocket srv("www.test.com",8080);
for ( ; ; )
{Poco::Net::StreamSocket ss &#61; srv.acceptConnection();Poco::Net::SocketStream str(ss);str <<"HTTP/1.0 200 OK\r\n""Content-Type: text/html\r\n""\r\n""""Hello world
"<
Poco::Net::SocketAddress socketAddress("www.test.com",8080);
Poco::Net::DatagramSocket datagram(socketAddress); char buffer[1024];
for ( ; ; ){Poco::Net::SocketAddress sender;int n &#61; datagram.receiveFrom(buffer, sizeof(buffer) - 1, sender);buffer[n] &#61; &#39;\0&#39;;std::cout <
.h文件
class LPoco
{public:
/*******************************************************************************///创建一个Tcp连接到服务器Poco::Net::SocketAddress LCtSocketToServer(std::string http,int port);//使用::Net::SocketStream类,它提供了一个I / O流StreamSocket接口Poco::Net::StreamSocket LRwStreamSocket(Poco::Net::SocketAddress socket);//format 流格式 比如xml ->/*str <<"GET / HTTP/1.1\r\n""Host: www.test.com\r\n""\r\n";*///拷贝流数据 使用内部缓冲区将从istr读取的所有字节写入std::ostream ostrvoid LCopyStream(Poco::Net::StreamSocket stream,std::string format,std::ostream & ostr, std::size_t bufferSize &#61; 8192);//拷贝流数据 使用内部缓冲区将从istr读取的所有字节写入string ostrstd::string LCopyString(Poco::Net::StreamSocket stream,std::string format,std::string & ostr, std::size_t bufferSize &#61; 8192);
/********************************************************************************/
};
.cpp文件
//创建一个Tcp连接到服务器
Poco::Net::SocketAddress LPoco::LCtSocketToServer(std::string http,int port)
{Poco::Net::SocketAddress sa(http, port);return sa;
}//使用::Net::SocketStream类,它提供了一个I / O流StreamSocket接口
Poco::Net::StreamSocket LPoco::LRwStreamSocket(Poco::Net::SocketAddress socket)
{Poco::Net::StreamSocket str(socket);return str;
}//format 流格式 比如xml ->/*str <<"GET / HTTP/1.1\r\n""Host: www.test.com\r\n""\r\n";*///拷贝流数据 使用内部缓冲区将从istr读取的所有字节写入ostr
void LPoco::LCopyStream(Poco::Net::StreamSocket stream,std::string format,std::ostream & ostr, std::size_t bufferSize)
{Poco::Net::SocketStream Socket(stream);Socket <}//拷贝流数据 使用内部缓冲区将从istr读取的所有字节写入string ostr
std::string LPoco::LCopyString(Poco::Net::StreamSocket stream,std::string format,std::string & ostr, std::size_t bufferSize)
{Poco::Net::SocketStream Socket(stream);Socket <}
方法调用&#xff1a;
LPoco m_poco;Poco::Net::SocketAddress stream &#61; m_poco.LCtSocketToServer("www.test.com", 8080);Poco::Net::StreamSocket socket &#61; m_poco.LRwStreamSocket(stream);std::string ostr;m_poco.LCopyString(socket,"GET / HTTP/1.1\r\n""Host: www.test.com\r\n""\r\n",ostr);std::cout <
DNS域名解析方式&#xff1a;
const HostEntry& entry &#61; DNS::hostByName("www.appinf.com");
//获取别名
const HostEntry::AliasList& aliases &#61; entry.aliases();
HostEntry::AliasList::const_iterator it &#61; aliases.begin();
int nNum &#61; 0;
for (; it !&#61; aliases.end(); &#43;&#43;it)
{std::cout <<"Alias: " <<*it <<"" <<&#43;&#43;nNum <
//获取地址
nNum &#61; 0;
const HostEntry::AddressList& addrs &#61; entry.addresses();
HostEntry::AddressList::const_iterator it1 &#61; addrs.begin();
for (; it1 !&#61; addrs.end(); &#43;&#43;it1)
{std::cout <<"Address: " <
介绍(引自官方)&#xff1a;
PocoFoundation是POCO的核心。它包含基础平台抽象层以及常用的实用程序类和功能。Foundation库包含用于固定大小整数的类型&#xff0c;用于在字节顺序之间转换整数的函数&#xff0c;Poco :: Any类&#xff08;基于boost :: Any&#xff09;&#xff0c;用于错误处理和调试的实用程序&#xff0c;包括各种异常类和对断言的支持。还提供了许多用于内存管理的类&#xff0c;包括基于引用计数的智能指针&#xff0c;以及用于缓冲区管理和内存池的类。对于字符串处理&#xff0c;POCO包含许多功能&#xff0c;其中包括修剪字符串&#xff0c;执行不区分大小写的比较和大小写转换。还可以通过类的形式获得对Unicode文本的基本支持&#xff0c;这些类可以在不同的字符编码&#xff08;包括UTF-8和UTF-16&#xff09;之间转换文本。那里支持格式化和解析数字&#xff0c;包括sprintf的类型安全变体。还提供了基于众所周知的PCRE库&#xff08;http://www.pcre.org&#xff09;的正则表达式。
PocoFoundation常用头定义&#xff1a;
#include “Poco/Logger.h”
#include “Poco/AutoPtr.h”
#include “Poco/ConsoleChannel.h”
#include “Poco/PatternFormatter.h”
#include “Poco/FormattingChannel.h”
#include “Poco/SimpleFileChannel.h”
#include “Poco/LocalDateTime.h”
#include “Poco/Message.h”
使用PocoFoundation框架需要包含库名&#xff1a;
PocoFoundation
.h文件
#include "Poco/Logger.h"
#include "Poco/AutoPtr.h"
#include "Poco/ConsoleChannel.h"
#include "Poco/PatternFormatter.h"
#include "Poco/FormattingChannel.h"
#include "Poco/SimpleFileChannel.h"
#include "Poco/LocalDateTime.h"
#include "Poco/Message.h"
#include
#include
#include
#include
#include
#include
.cpp文件
/**
* 李坤昱
*/
static bool g_bValid &#61; false;
static std::string defaltName;
std::map
{}poco_log::poco_log(LoggerInfo log):m_logInfo(log)
{}void poco_log::init(LoggerInfo log)
{m_logInfo &#61; log;if (log.use_console_log)m_Channel &#61; new Poco::ConsoleChannel;else{m_Channel &#61; new Poco::SimpleFileChannel;char StrFormat[256] &#61; {0};Poco::LocalDateTime local;local.utcTime();sprintf(StrFormat,"%s%s%d%02d%02d%02d%02d%02d%s",log.target.c_str(),log.app_name.c_str(),local.year(),local.month(),local.day(),local.hour(),local.minute(),local.second(),SUFFIX);std::string logname(StrFormat);m_Channel->setProperty("path",logname);memset(StrFormat,0,sizeof(StrFormat));sprintf(StrFormat,"%d M",log.rotation_size / 1024 / 1024);m_Channel->setProperty("rotation", StrFormat);}//m_patternFormatter &#61; new Poco::PatternFormatter("[%Y-%n-%e %H:%M:%S] [%U(%u)] %p: %t");m_patternFormatter &#61; new Poco::PatternFormatter("[%Y-%n-%e %H:%M:%S] [%p]: %t");m_patternFormatter->setProperty("times", "local"); // 格式化中的时间显示为本地时间m_formattingChannel &#61; new Poco::FormattingChannel(m_patternFormatter, m_Channel);m_logger.setLevel(log.loglevel);m_logger.setChannel(m_formattingChannel);g_bValid &#61; true;
}void poco_log::error(std::string str)
{if (!str.empty()){//m_logger.setChannel(m_formattingChannel);m_logger.error(str);}}void poco_log::debug(std::string str)
{if (!str.empty()){//m_logger.setChannel(m_formattingChannel);m_logger.debug(str);}
}void poco_log::fatal(std::string str)
{if (!str.empty()){//m_logger.setChannel(m_formattingChannel);m_logger.fatal(str);}
}void poco_log::warning(std::string str)
{if (!str.empty()){//m_logger.setChannel(m_formattingChannel);m_logger.warning(str); }
}void poco_log::trace(std::string str)
{ if (!str.empty()){//m_logger.setChannel(m_formattingChannel);m_logger.trace(str);}
}void poco_log::critical(std::string str)
{if (!str.empty()){//m_logger.setChannel(m_formattingChannel);m_logger.critical(str);}
}void poco_log::information(std::string str)
{if (!str.empty()){//m_logger.setChannel(m_formattingChannel);m_logger.information(str);}
}void poco_log::notice(std::string str)
{if (!str.empty()){//m_logger.setChannel(m_formattingChannel);m_logger.notice(str);}
}void init_logger(const std::string app_name,const std::string app_version,bool use_console_log,bool file_log,const std::string target,std::string loglevel,int64_t rotation_size,bool auto_flush)
{g_logger &#61; {app_name,app_version,use_console_log,file_log,target,loglevel,rotation_size,auto_flush};defaltName &#61; app_name;
}void LOGE(std::string logs,std::string type)
{if (!LOGVALID)return;std::string logname &#61; (type.empty() ? defaltName : type);poco_log *logObj &#61; GetLogObj(logname);if (0 &#61;&#61; logObj){if (0 &#61;&#61; (logObj &#61; CreateLogObj(logname)))return;elselogObj->error(logs);} elselogObj->error(logs);
}void LOGE_Fmt(const char *fmt, ...)
{if (!LOGVALID)return;//定义接收输出信息最大长度1024字节char printf_buf[1024];//记录fmt对应的地址va_list args;//得到首个%对应的字符地址va_start(args, fmt);int printed &#61; vsprintf(printf_buf, fmt, args);va_end(args);LOGE(std::string(printf_buf));
}void LOGE_Fmt_Type(std::string type,const char *fmt, ...)
{if (!LOGVALID)return;//定义接收输出信息最大长度1024字节char printf_buf[1024];//记录fmt对应的地址va_list args;//得到首个%对应的字符地址va_start(args, fmt);int printed &#61; vsprintf(printf_buf, fmt, args);va_end(args);LOGE(std::string(printf_buf),type);
}void LOGD(std::string logs,std::string type)
{if (!LOGVALID)return;std::string logname &#61; (type.empty() ? defaltName : type);poco_log *logObj &#61; GetLogObj(logname);if (0 &#61;&#61; logObj) {if (0 &#61;&#61; (logObj &#61; CreateLogObj(logname)))return;elselogObj->debug(logs);}elselogObj->debug(logs);
}void LOGD_Fmt(const char *fmt, ...)
{if (!LOGVALID)return;//定义接收输出信息最大长度1024字节char printf_buf[1024];//记录fmt对应的地址va_list args;//得到首个%对应的字符地址va_start(args, fmt);int printed &#61; vsprintf(printf_buf, fmt, args);va_end(args);LOGD(std::string(printf_buf));
}void LOGD_Fmt_Type(std::string type,const char *fmt, ...)
{if (!LOGVALID)return;//定义接收输出信息最大长度1024字节char printf_buf[1024];//记录fmt对应的地址va_list args;//得到首个%对应的字符地址va_start(args, fmt);int printed &#61; vsprintf(printf_buf, fmt, args);va_end(args);LOGD(std::string(printf_buf),type);
}void LOGW(std::string logs,std::string type)
{if (!LOGVALID)return;std::string logname &#61; (type.empty() ? defaltName : type);poco_log *logObj &#61; GetLogObj(logname);if (0 &#61;&#61; logObj) {if (0 &#61;&#61; (logObj &#61; CreateLogObj(logname)))return;elselogObj->warning(logs);}elselogObj->warning(logs);
}void LOGW_Fmt(const char *fmt, ...)
{if (!LOGVALID)return;//定义接收输出信息最大长度1024字节char printf_buf[1024];//记录fmt对应的地址va_list args;//得到首个%对应的字符地址va_start(args, fmt);int printed &#61; vsprintf(printf_buf, fmt, args);va_end(args);LOGW(std::string(printf_buf));
}void LOGW_Fmt_Type(std::string type,const char *fmt, ...)
{if (!LOGVALID)return;//定义接收输出信息最大长度1024字节char printf_buf[1024];//记录fmt对应的地址va_list args;//得到首个%对应的字符地址va_start(args, fmt);int printed &#61; vsprintf(printf_buf, fmt, args);va_end(args);LOGW(std::string(printf_buf),type);
}void LOGC(std::string logs,std::string type)
{if (!LOGVALID)return;std::string logname &#61; (type.empty() ? defaltName : type);poco_log *logObj &#61; GetLogObj(logname);if (0 &#61;&#61; logObj) {if (0 &#61;&#61; (logObj &#61; CreateLogObj(logname)))return;elselogObj->critical(logs);}elselogObj->critical(logs);
}void LOGC_Fmt(const char *fmt, ...)
{if (!LOGVALID)return;//定义接收输出信息最大长度1024字节char printf_buf[1024];//记录fmt对应的地址va_list args;//得到首个%对应的字符地址va_start(args, fmt);int printed &#61; vsprintf(printf_buf, fmt, args);va_end(args);LOGC(std::string(printf_buf));
}void LOGC_Fmt_Type(std::string type,const char *fmt, ...)
{if (!LOGVALID)return;//定义接收输出信息最大长度1024字节char printf_buf[1024];//记录fmt对应的地址va_list args;//得到首个%对应的字符地址va_start(args, fmt);int printed &#61; vsprintf(printf_buf, fmt, args);va_end(args);LOGC(std::string(printf_buf),type);
}void LOGF(std::string logs,std::string type)
{if (!LOGVALID)return;std::string logname &#61; (type.empty() ? defaltName : type);poco_log *logObj &#61; GetLogObj(logname);if (0 &#61;&#61; logObj) {if (0 &#61;&#61; (logObj &#61; CreateLogObj(logname)))return;elselogObj->fatal(logs);}elselogObj->fatal(logs);
}void LOGF_Fmt(const char *fmt, ...)
{if (!LOGVALID)return;//定义接收输出信息最大长度1024字节char printf_buf[1024];//记录fmt对应的地址va_list args;//得到首个%对应的字符地址va_start(args, fmt);int printed &#61; vsprintf(printf_buf, fmt, args);va_end(args);LOGF(std::string(printf_buf));
}void LOGF_Fmt_Type(std::string type,const char *fmt, ...)
{if (!LOGVALID)return;//定义接收输出信息最大长度1024字节char printf_buf[1024];//记录fmt对应的地址va_list args;//得到首个%对应的字符地址va_start(args, fmt);int printed &#61; vsprintf(printf_buf, fmt, args);va_end(args);LOGF(std::string(printf_buf),type);
}void LOGI(std::string logs,std::string type)
{if (!LOGVALID)return;std::string logname &#61; (type.empty() ? defaltName : type);poco_log *logObj &#61; GetLogObj(logname);if (0 &#61;&#61; logObj) {if (0 &#61;&#61; (logObj &#61; CreateLogObj(logname)))return;elselogObj->information(logs);}elselogObj->information(logs);
}void LOGI_Fmt(const char *fmt, ...)
{if (!LOGVALID)return;//定义接收输出信息最大长度1024字节char printf_buf[1024];//记录fmt对应的地址va_list args;//得到首个%对应的字符地址va_start(args, fmt);int printed &#61; vsprintf(printf_buf, fmt, args);va_end(args);LOGI(std::string(printf_buf));
}void LOGI_Fmt_Type(std::string type,const char *fmt, ...)
{if (!LOGVALID)return;//定义接收输出信息最大长度1024字节char printf_buf[1024];//记录fmt对应的地址va_list args;//得到首个%对应的字符地址va_start(args, fmt);int printed &#61; vsprintf(printf_buf, fmt, args);va_end(args);LOGI(std::string(printf_buf),type);
}void LOGN(std::string logs,std::string type)
{if (!LOGVALID)return;std::string logname &#61; (type.empty() ? defaltName : type);poco_log *logObj &#61; GetLogObj(logname);if (0 &#61;&#61; logObj) {if (0 &#61;&#61; (logObj &#61; CreateLogObj(logname)))return;elselogObj->notice(logs);}elselogObj->notice(logs);
}void LOGN_Fmt(const char *fmt, ...)
{if (!LOGVALID)return;//定义接收输出信息最大长度1024字节char printf_buf[1024];//记录fmt对应的地址va_list args;//得到首个%对应的字符地址va_start(args, fmt);int printed &#61; vsprintf(printf_buf, fmt, args);va_end(args);LOGN(std::string(printf_buf));
}void LOGN_Fmt_Type(std::string type,const char *fmt, ...)
{if (!LOGVALID)return;//定义接收输出信息最大长度1024字节char printf_buf[1024];//记录fmt对应的地址va_list args;//得到首个%对应的字符地址va_start(args, fmt);int printed &#61; vsprintf(printf_buf, fmt, args);va_end(args);LOGN(std::string(printf_buf),type);
}void LOGT(std::string logs,std::string type)
{if (!LOGVALID)return;std::string logname &#61; (type.empty() ? defaltName : type);poco_log *logObj &#61; GetLogObj(logname);if (0 &#61;&#61; logObj) {if (0 &#61;&#61; (logObj &#61; CreateLogObj(logname)))return;elselogObj->trace(logs);}elselogObj->trace(logs);
}void LOGT_Fmt(const char *fmt, ...)
{if (!LOGVALID)return;//定义接收输出信息最大长度1024字节char printf_buf[1024];//记录fmt对应的地址va_list args;//得到首个%对应的字符地址va_start(args, fmt);int printed &#61; vsprintf(printf_buf, fmt, args);va_end(args);LOGT(std::string(printf_buf));
}void LOGT_Fmt_Type(std::string type,const char *fmt, ...)
{if (!LOGVALID)return;//定义接收输出信息最大长度1024字节char printf_buf[1024];//记录fmt对应的地址va_list args;//得到首个%对应的字符地址va_start(args, fmt);int printed &#61; vsprintf(printf_buf, fmt, args);va_end(args);LOGT(std::string(printf_buf),type);
}//获取日志对象
poco_log *GetLogObj(std::string type)
{auto it &#61; Llogs.find(type); if (Llogs.end() !&#61; it)return it->second;return 0;
}//创建日志类型
poco_log *CreateLogObj(std::string type)
{poco_log *logObj &#61; new poco_log;LoggerInfo logger &#61; g_logger;logger.app_name &#61; type;logObj->init(logger);Llogs[type] &#61; logObj;return logObj;
}//释放所有日志对象
void FreeLogObjs()
{for(auto it &#61; Llogs.begin();it !&#61; Llogs.end();it&#43;&#43;){if (it->second)delete it->second,it->second &#61; 0;}
}
init_logger("test","1.0.0",1(日志输出到控制台),1(保存日志到文件),"/tmp",0);
LOGI_Fmt("load ini ... :%s \n","test.ini");
Poco::AutoPtr
taskalloc->func();
解析json&#xff1a;
//获取json数据Parser parser;Var result &#61; parser.parse(msg);//转换为可以解析key的jsonPoco::JSON::Object::Ptr object &#61; result.extract
转换为json格式的数据&#xff1a;
JSON::Object json;json.set("test", "123");std::stringstream out;Poco::JSON::Object::Ptr Object &#61; json.extract
char StrFormat[256] &#61; {0};
Poco::LocalDateTime local;
local.utcTime();
sprintf(StrFormat,"02d%02d%02d%02d%02d",local.year(),local.month(),local.day(),local.hour(),local.minute(),local.second());
class Task : public Poco::Runnable{virtual void run(){}virtual void release(){}};Poco::ThreadPool m_workthrdpool;
//初始化线程数量
m_workthrdpool.addCapacity(8);
//线程池调用
if (0
}
//互斥锁
Poco::Mutex m_mutex;
m_mutex.lock();
m_mutex.unlock();
class Lock : public Poco::Runnable
{
public:Lock( Poco::Mutex& mtx ):m_mtx(mtx){}void run( ){//获取锁Poco::Mutex::ScopedLock s( m_mtx);}private:Poco::Mutex& m_mtx;
};
//互斥锁
Poco::Mutex m_mutex;
void test()
{Lock lock(m_mutex);lock.run();
}
PocoUtil属于命令行程序及后台程序相关框架&#xff0c;集成功能有&#xff1a;
命令行参数调用、后台程序启动等&#xff0c;这个框架提供了对于Unix守护进行的支持。
PocoUtil常用头定义&#xff1a;
#include “Poco/Util/Application.h”
#include “Poco/Util/ServerApplication.h”
#include “Poco/Util/Option.h”
#include “Poco/Util/OptionSet.h”
#include “Poco/Util/HelpFormatter.h”
#include “Poco/Util/IntValidator.h”
#include “Poco/Util/RegExpValidator.h”
#include “Poco/Util/Subsystem.h”
使用PocoUtil框架需要包含库名&#xff1a;
PocoFoundation
PocoUtil
.h文件
using namespace Poco;class LPoco_Cli : public Util::Application
{
public:void initialize( Application& self );void uninitialize( );void defineOptions( Util::OptionSet& options);//void handleHelp(const std::string& name, const std::string& value);//versionvoid handleVersion(const std::string& name, const std::string& value);
}
.cpp文件
//程序名称
const char *__progname &#61; "test";
void LPoco_Cli::initialize( Application& self )
{Util::Application::initialize( self );
}void LPoco_Cli::uninitialize( )
{Util::Application::uninitialize( );
}void LPoco_Cli::defineOptions( Util::OptionSet& options)
{Util::Application::defineOptions( options );//必须调用m_options &#61; options;options.addOption(Util::Option("help", "h","show the help messages").required(false).repeatable(false).callback(Util::OptionCallback
}void LPoco_Cli::handleHelp(const std::string& name, const std::string& value )
{std::cout <<__progname <<" Global command help:" <
{std::cout <<__progname <<" version :" <
{std::function
}
在main函数中&#xff1a;
try{LPoco_Cli app;app.init( argc, argv );//在这里传主函数参数。app.run( );}catch( Poco::Exception &e ){std::cerr <<"error: " <